Just to wade into this one for fun...

Java doesn't have very good support for "value"-oriented abstractions
like complex numbers, strings, RGB-colors, etc, corresponding
to what would be a *non*-limited private type in Ada.

It only has good support for "object"-oriented abstractions, which would
correspond to *limited* private types in Ada.

Smalltalk is like Java in this sense.

Note that Ada 83 had relatively weak support for "value"-oriented
abstractions, because it lacked user-defined assignment, finalization,
equality, and streaming.

With Ada 95's "controlled" and "stream" stuff, plus the ability
to define user-defined equality more generally, Ada's support for
value-oriented abstractions is now very good.

The closest Java comes to a "value" type is the notion of
a "clonable" object, plus user-defined serialization,
but "clone" must always be called explicitly, and there
is no automatic composition of operations when composite
objects are used, the way you get in Ada 95 for finalization,
assignment, and equality.

-Tuck