&gt; However, these types (excepting unboxed types) can also be considered reference types since that is how values are passed.<p>This is an implementation detail, and abstractions shall never be conflated with their possible implementations. What matters to the user of the abstraction is that you&#x27;re passing around (a computation[0] that evaluates to) the value itself, not some mutable entity whose current state is the value.<p>&gt; So another viewpoint is that boxed Haskell types are just like Java reference types, but they are immutable.<p>This is wrong. In Java, all objects have a distinct identity, so, for instance, `new Complex(2,3) == new Complex(2,3)` evaluates to `false`, even if both objects represent the complex number `2+3i`.<p>[0] Since Haskell is non-strict.