Strong typing has a bad rap these days. Someday (read: never), I will have to write an article about how it is not evil. Especially since strong typing was a big part of what made me "downgrade" from Lisp to Java.
Yesterday, I spent a couple of hours sweeping through our "application in crisis". Being a Java application that uses RCP and Hibernate, there was a lot of run-time type checking going on. Unnecessarily, I might add. By declaring the real types of objects (instead of just Object), the compiler dutifully found a bunch of bugs that would have taken a whole lot of testing, or customer deployment, to find. Bugs like: confusion over whether an entity's key was scalar or composite; using the wrong return type for a query; diverging from the mandated equals/hash code strategy; or trying to persist non-persistent objects. All found at the cost of a few minutes of adding appropriate declarations.