Agreed. Languages like OCaml are actually higher-order imperative languages. They have a very rich, expressive system of "values". A value can be a function value, partially un-curried, and closed over arbitrary data. They can also be data values but can be arbitrarily complex. How many languages let you say:
let tree = Node (Node (Leaf 3) (Leaf 4)) (Node (Leaf 7) (Leaf 8))
This value is constant, just like an integer or string constant in many languages. In other words, the right-hand side can be arbitrarily complex. And this data structure gets passed around in a very lightweight manner (by reference, not by copying).
The Java notion that values are either primitive, or objects... is limiting.