By "Classic static typing", do you mean C++/Java-style static typing, or does it include Haskell/ML-style type inference as well?
ArrayList myList = new ArrayList(new Object[] { "foo", 42, new Bar() });
for(Object elem : myList) {
if(elem instanceof String) doStringThing((String) elem);
else if(elem instanceof Number) doNumberThing((Number) elem);
else if(elem instanceof Bar) doBarThing((Bar) elem);
else doObjectThing(elem);
}
Or you could keep elements as Objects until you needed to perform a specific operation on them, then cast at the site and perform the operation, letting the ClassCastException propagate if you're wrong. This is basically what Arc does.