I know what optimisations identity-less aggregates allow. Objects can be passed around in O(1) time in any language that uses references. It&#x27;s not the issue. Indeed passing value types is O(n) in the size of the value type, so that&#x27;s a loss. The goal is to avoid data dependent loads (i.e. pointer dereferences) by flattening&#x2F;inlining data structures.<p>As you point out, Haskell <i>could</i> in theory merge things together and lay out memory more effectively, but <i>in theory</i> so could Java with e.g. interprocedural escape analysis. But in practice there&#x27;s a limit to what automatic compiler optimisations can do - learning this the hard way is a big part of the history of functional languages (like, how many functional language runtimes automatically parallelise apps with real speedups?). Java <i>sometimes</i> does convert object allocations into value types via the scalarisation optimisations, but not always, hence the desire to add it to the language.