An optional type system is better than no type system at all, but I still favour static typing with type inference. I'd particularly favour static typing for projects having larger code bases that have insufficient test coverage.
Again, I think languages like Java are weak not because they have a static type system, but because they have a poorly designed static type system, have generally verbose syntax that doesn't allow you to easily compose functions (as can a functional language like Haskell), and have too few libraries that are feature rich and easy to use.
However, I think static type systems are more popular than dynamic type systems (see table under Categories of Programming Languages at http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
) for good reasons and not because their users are blind Java or C++ sheep. The most important reason is that static type systems avoid so many potential runtime errors. A functional language like Haskell demonstrates that you can have not only safety, but higher-level abstraction as well. Haskell may take longer to understand and even longer to master, but its benefits are worth the effort.