different body classes for each category

If i understood what you are lookin for, this should work, it uses get_queried_object() function:

// Adding categories name to body class on archives
add_filter('body_class','add_category_to_body_class');
function add_category_to_body_class( $classes ) {
    // check if in category
    if ( is_category() ) {
        // get the queried object, in this case, a category object, and assigns to a variable
        // see https://codex.wordpress.org/Function_Reference/get_queried_object
        $category_object = get_queried_object();
        // get the slug
        $classes[] = $category_object->slug;
        $classes[] = $category_object->slug . '_index';
    }
  // return the $classes array
  return $classes;
}

but you can mix it to your single function:

// Adding categories name to body class on archives
add_filter('body_class','add_category_to_body_class');
function add_category_to_body_class( $classes ) {
    if ( is_single() ) {
        global $post;
        // assigns post it to variable to avoid reading an array for every loop iteration
        // maybe a micro optmization? Guilty as charged!
        $post_id = $post->ID;
        foreach( ( get_the_category( $post_id ) ) as $category ) {
            // add category slug to the $classes array
            $classes[] = $category->category_nicename;
            $classes[] = $category->category_nicename . '_index';
        }
    }
    // check if in category
    else if ( is_category() ) {
        // get the queried object, in this case, a category object, and assigns to a variable
        // see https://codex.wordpress.org/Function_Reference/get_queried_object
        $category_object = get_queried_object();
        // get the slug
        $classes[] = $category_object->slug;
        $classes[] = $category_object->slug . '_index';
    }
    else {
        $classes[] = 'index';
    }
    // return the $classes array
    return $classes;
}

I hope it helps.