Keep in mind that Java came out about 5 years before a certain similar language that has reference types. The designers of that language made some decisions based on trying to learn from things that didn&#x27;t work out so well in Java.<p>To some extent both languages were trying to deal with C++&#x27;s having three different kinds of types: Atomics, objects and structs. If I had to tell a made-up story, I&#x27;d guess that Java&#x27;s designers looked at that and decided structs were in many ways just a more limited version of classes with some confusing semantic quirks, and therefore decided to nix them. That left atomics and objects, and the rest is history.<p>C#&#x27;s folks then reconsidered it and realized that, from a high level perspective, atomics are really just a special case of structs. (Side note: still telling that made-up story.) So they kept structs, unified them with atomics in the language,* and let the compiler deal with the rest. It works well and seems like an obviously better way to do it, but I&#x27;m not sure that insight would have been so obvious in the moment.<p>* Edit: Oh, and made structs a subtype of System.Object. Unlike Java, .NET&#x27;s more-or-less fully object-oriented.