Strangely, no one connects the many claims that garbage collected languages "eliminate a whole class of programming errors" is good with the aforementioned "typed languages eliminate a whole class of programming errors" as good also.
Almost nobody uses "untyped languages". Few of those even exist, with Forth and various assembly languages being the main examples. (C, with its type system that is as airtight as a sieve, gets an honorary mention.)
You're probably harping about dynamically typed languages. In such languages, the runtime still knows *exactly* what type every item of data has. These are not weakly typed. But what you obviously prefer are "statically typed" languages.
Static typing might statistically reduce some errors, but it certainly can't "eliminate whole classes". Consider "set_warhead_target(float latitude, float longitude)". Did the type system give you any protection from accidentally swapping the two parameters? That's really the problem that you're so worried about: accidentally using the wrong data value in the wrong place.
However, very few statically typed languages (with Rust being a notable exception) have eliminated the biggest source of type errors in computing: Null, which is a bogus placeholder that matches any pointer type (or reference type, depending on the language's nomenclature). So in many cases you have no less risk with static typing than you do with accidentally feeding a string into a Python sqrt() function. And in the case of C or C++, you can be much worse off, as in segfaults and remote exploits.