In the app I work on a huge percentage (60% in the timeframe I analyzed) of the errors are errors a type system would catch. Nil references, long method chains where the middle call returns a different object than expected, bad refactorings changing the return type of methods…
It’s staggering really. These could be solved with better programming practices, they’re not errors usually experienced programmers make, but they exist nonetheless.
An exception/error system, with checked exceptions or handling of errors via result monad/errors like in Go, would solve the vast majority of other errors.
Type systems also encourage other things like contracts on API endpoints and typed messages, serving as a early warning system when writing those bugs.
Purely business logic bugs are actually not common. I guess we haven’t had the opportunity to create those “higher order” bugs while wading through the others.