Types however, are not a substitute for unit tests. No type system is going to tell me if my income tax calculator covers all the edge cases.
All tests should be on business logic - code logic might not fit the business case at all and so that should be a fail.
That said, I don't follow what you mean by "to test is business logic, not code logic." To me, that is a distinction without difference.
An income tax calculator in a (sane) tax system is essentially a set of pure of functions or classes. This is a perfect place for a unit test. I might have additional unit tests for sub components of the hairy bits, but it's still unit tests all the way.
If you use a language like Python, having tests that pass things that aren't the type you are expecting are useful. Likewise passing nulls to a nullable parameter, or different objects to an Object/Any type (or even a different implementation/type to a supertype parameter).
Those tests are part of the unit test repertoire, but unit tests should cover both expected cases/behaviour and unexpected cases.
I fail to find a better example (complex functions of high arity with parameters from the same type ?).