The type system only goes so far. If your refactored code calls functions that take several different parameters of the same type, you can make mistakes that the compiler won't catch.
There are workarounds for this kind of thing. Haskell uses newtypes to wrap a value with a semantically meaningful tag. Scala has a similar concept called "value types." That means you could turn something like this:
loginUser(String, String)
Into this:
loginUser(Username, Password)
These aren't just type aliases. So far as the language is concerned, Username and Password are incompatible types.