I could imagine it’s a parsing issue. E.g. in Java annotation parameters, you don’t want to allow arbitary expressions, but only literals and class references.
It’s just for added clarity for humans.
class C {}
C C = new C();
print( C ); // <- is this the class or the variable?
Of course you can avoid this problem using coding conventions, and some languages (e.g., Groovy) do use the established convention to avoid the .class syntax.
Next to parsing issues; A type literal like JavaClass.class also has a special static type property, namely that it returns an instance of Class<JavaClass> and not Class<?> as it would do if it were comparable to a runtime dereference. So the .class literal is for literal types only, And it returns a representation of the type with a most concrete static type parameter of the Class Type kind.
This then has its uses in java, to be able to statically bind type parameters by passing type literals as parameters to methods. Like <T> T cast(Class<T> type, Object o) { return (T) o; }