The reason for case 4 not being supported but the other cases being supported are historical. The factors are lobbying and political interplay between some early influential programmers and compiler vendors, rather than a deliberate reasoned technical decision.
So, if you're looking for a robust technical justification, you won't find one.
Historically, cases 2 and 3 have been supported since quite early in the evolution of C. Your case 2 achieves the same effect as
char s[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
There is no counterpart of string literals to initialise arrays of anything other than char types.
Historically, case 1 is an anomaly introduced by programmers who wanted to achieve the effect of
char s_temp[] = "Hello";
char *s = temp_s;
with less typing (i.e. as a single statement). The lobbying for support of case 1 eventually won out (it was introduced into mainstream compilers, and later into the standard). Case 1 is the only case in the standard where a pointer can be initialised directly using an array initialiser without any need for a type conversion.
Historically, there has never been demand or lobbying from programmers for case 4.
Which, like it or not, is the reason why case 1,2,3 are supported but case 4 is not.
There is no real comparison between cases 2 and 4, because they (seek to) achieve different things. A string literal, as in case 2, is an array initialiser that only works for arrays of char - there is no counterpart for non-char types. Case 4 is trying to initialise a pointer using an array initialiser.