It becomes obvious if you read it in context
An object is a class instance or an array.
The reference values (often just references) are pointers to these
objects, and a special null reference, which refers to no object.
A class instance is explicitly created by a class instance creation
expression (§15.9).
An array is explicitly created by an array creation expression
(§15.10.1).
So this is why it's defined this way. The mode of their creation is different, and this is how you can define it in a sensible way.
When reading the JLS, it's always a good idea to read sections from start to finish as concepts are often introduced top-down: they're named first, then explained in the paragraphs that follow.
Of course you could do it the way you've suggested:
An object is a class instance and an array is a class instance too.
Class instances are explicitly created by a not-an-array class instance creation
expression (§15.9) if they're not arrays or an array creation
expression (§15.10.1) if they're arrays
Or you could find a name for these not-array-but-objects, let's call them class schminstance and we're back to square one.
If the question is about why arrays had to be created different in the first place (and not all be instances of an Array
class for example), it's because Java originally didn't have generics/type parameters. But they needed something like it for arrays (otherwise you couldn't have methods that would sort any array for example), so this is what they've come up with. They also made arrays covariant (an object of type String[]
is also an Object[]
, but an Object[]
containing only strings is not a String[]
), which makes them differ from generics.