There are, of course, also literals for all the primitive numeric types, and the booleans true and false, and chars. I suppose you could reply that in your question you technically said "no literals for any other classes". Okay. I think someone pointed out that "null" is a literal Object, so your statement is technically inaccurate, but I think that's the only other example.
But then, the next obvious question is, what other classes would you want to have literals for? If you were designing the language, what would a BufferedReader literal look like? Or a ResultSet literal? Or a JCheckBox?
You could theoretically say that, for example, a "File literal" is the file name enclosed in some special delimiter, like "$/home/bob/myfile.txt$". But then someone could say, What about a JButton, couldn't we make a literal for that like with the text of the button and the ActionListener it fires and appropriate delimiters, like "%Submit,SubmitListener%". And then what about Sockets, couldn't we put the host name in some special delimiter, etc. I think it's pretty clear we'd quickly run out of punctuation marks to use as delimiters. So we'd end up having to write some sort of text to identify which class we're talking about, like saying File("/home/bob/myfile.txt") or Socket("www.example.com",631). But that looks an awful lot like a constructor, and we'd be right back to what the authors of Java actually did.
The number of "things" that can be expressed purely by the nature of the value (e.g. all digits make a numeric literal) or with punctuation is pretty limited by the number of punctuation marks that can be reaonably fit on a keyboard. And would you want a keyboard with 600 special icons for all the different sort of things you might want to talk about? Words are so much easier and more flexible.
String is so commonly used, and alternatives would have been so awkward, that it made sense to make it a special case.