Static typing defends against much more than simple errors that are easy to fix.
When you want to refactor your codebase and have thousands of calls to a method when you rename it and don't have static typing you have no idea where things broke with out having a unit test for each invocation.
My personal preference is for inferred typing where you get the benefits of static typing with out the line noise of static typing. (eg. F#) C# is taking another interesting middle ground with dynamic invocation. I think the real answer lies in inferred typing by default and static / dynamic typing (invocation) where and when you need it. There is no one universal answer but I think providing both options to the programmer is best so they can decide what is best for their particular situation.
When you want to refactor your codebase and have thousands of calls to a method when you rename it and don't have static typing you have no idea where things broke with out having a unit test for each invocation.
My personal preference is for inferred typing where you get the benefits of static typing with out the line noise of static typing. (eg. F#) C# is taking another interesting middle ground with dynamic invocation. I think the real answer lies in inferred typing by default and static / dynamic typing (invocation) where and when you need it. There is no one universal answer but I think providing both options to the programmer is best so they can decide what is best for their particular situation.