Just because a language is dynamically typed doesn't mean that you should do things like dynamically modify objects in your code, assign int to strings, and so on, even if you can do it. Contrary to popular belief, you can write clean Python code that is easily debugabble and testable.
Likewise, most any static typing language out there allows you to ride shitty code should you so chose. In fact, it seems to be that the more strict a language is, the more people try to get around the strictness for their particular use case, and consequently, you get a bunch of standardized syntax or libraries for this that create more complexity than is needed.
The only real value of having static typing is having ULTRA strict real static typing where you define what data is, what operations can you do on that data, and what are all the possible outcomes on that data. Then, if you program compiles, by definition, it is correct. I think Coq comes pretty close to this, considering its designed as a theorem prover.