In Haskell, since it is a pure language, every type is a value type in the sense that you can pass around values without worrying that callees might overwrite your data.<p>However, these types (excepting unboxed types) can also be considered reference types since values are technically passed by reference. Boxed values are  stored in thunks, and only accessed through these (at least conceptually). Thunks in turn have GC overhead.<p>Boxed values have even associated internal state, but there is not much control over it: the state of their evaluation.<p>So another viewpoint is that boxed Haskell types are just like Java reference types, but from the outside they seem immutable.