Though I agree with the spirit of Gosling's assertion, I accept and practice referring to an object's type. That does not compromise the important distinction between type and class that lies in separating interface and implementation. Conclusion Type and class are not indistinguishable. Types define module boundaries. That allows compile time type-checking to ensure the proper interaction with and between runtime objects.
Classes define code implementation.
At runtime, objects obtain their implementation marching orders from class definitions. The distinction between type and class also plays an important part in understanding inheritance. Both class and interface declarations affect a system's type inheritance hierarchy. By supporting multiple type inheritance, a supertype reference can attach to various subtype objects. Only class declarations, however, affect a system's implementation inheritance.