While I understand your first and third points, I'm not sure I get this one. Java makes it relatively easy to enforce loose coupling with its "private" keyword.
That's not quite what I mean. Whilst Java provides keywords to enforce loose coupling, its syntax and standard library don't make it easy to do so.
For example, in Clojure I could write:
(defn bag [coll]
(reduce #(merge-with + %1 {%2 1}) {} coll))
The collection we're going to turn into a bag could be any sequencable data. In Java, you could use generics, but you wouldn't be able to treat, say, strings in the same way:
=> (bag "hello")
{\o 1, \l 2, \e 1, \h 1}
Here's another example:
(use 'clojure.contrib.duck-streams)
(def words1 (read-lines "/usr/share/dict/words"))
(def words2 (read-lines "http://www.puzzlers.org/pub/wordlists/pocket.txt"))
In this case, the duck-streams library is equally happy reading lines from a file or from a URL.
In other words, functions in Clojure, like many dynamic languages, usually pay more attention to the traits of an argument than to its type. Java's type system isn't flexible enough to do this on the same scale, and Java's standard types are also too inconsistently structured.