Checking dynamic types us not the work of a compiler. Checking types at compile time is static type checking. If a type is wholly dynamic (determined at runtime via something like casting to a type specified in user input), the compiler can't check it.
(Also, type inference is orthogonal to static vs dynamic typing.)
> Checking dynamic types us not the work of a compiler. Checking types at compile time is static type checking.
By your logic, Common Lisp is both dynamically and statically typed, because compile-time type checks are done by the compiler and warnings/errors are signaled whenever proper.
More, if you declare (OPTIMIZE SPEED), the compiler is going to print a list of all places where it was unable to infer types on its own and where it expects help from the programmer in form of type declarations for individual variables.
(Also, type inference is orthogonal to static vs dynamic typing.)