<i>This is an implementation detail, and abstractions shall never be conflated with their possible implementations</i><p>We&#x27;re talking about performance here, right? So unfortunately this statement is totally untrue in that context.<p>Java world wants value types largely to avoid pointer chasing that hurts cpu cache effectiveness. Haskell suffers the same issue, then. You can make what are effectively value types in Java as long as you don&#x27;t use == to compare but rather .equals, make all the fields final, override toString&#x2F;equals&#x2F;hashcode etc, and more sensible JVM targeting languages of course convert == into calls to .equals by default.