Because JIT compilers are able to bend the rules if proven correct.<p>For example, if you declare something like<p><pre><code>    final class Point {
          final int x, y;

          &#x2F;&#x2F;...
    }
</code></pre>
The Azul JIT compiler will transform it into a struct, just like in C, via their &quot;StructuredArray and ObjectLayout&quot; optimizations.<p>IBM J9 also does similar optimizations via packed objects, as they call it.<p>JIT compilers also remove locks and synchronized blocks if heuristics prove their are never needed in the dataflow.<p>In any case, by Java 10, real value types are expected to be part of the language.