I can't speak to the others, but Immutable is not in any way sufficient to replace native immutable data structures. The fact that you don't get native notation for initialization or destructuring is a huge deal in practice. Nobody wants to write 'foo.get("a").get("b").get("c")' where "foo.a.b.c" would do. (Likewise for assignment/creation.)