The nice thing about dynamic types is that they give you the expressive power to code things that would not be allowed (or at least not encouraged) in your type system, even though they might be allowed in a different type system. Back in the day, one notable example of this was parametric polymorphism: it comes "for free" in even the simplest dynamic language but took a while to become mainstream in static languages.
IMO, in an ideal world you would able to choose between dynamic and static verification of types depending on what your program is doing. This might even let us work with richer types than we do now! For example, most typed languages still do dynamic tests for array indexes because doing those statically requires dependent types (which are hard to use and not always worth the trouble). But if we had a language that lets us talk about the array lengths in the type system we would at least be able to give better error messages if something goes wrong, even if we only find out about it at runtime.
IMO, in an ideal world you would able to choose between dynamic and static verification of types depending on what your program is doing. This might even let us work with richer types than we do now! For example, most typed languages still do dynamic tests for array indexes because doing those statically requires dependent types (which are hard to use and not always worth the trouble). But if we had a language that lets us talk about the array lengths in the type system we would at least be able to give better error messages if something goes wrong, even if we only find out about it at runtime.