There is at least one case when one SHOULD NOT squash: renaming files AND changing them "too much" will make git lose the link between the original file and the renamed one.
In this scenario one should:
rename the file (depending on the file type this might introduce slight changes to it, e.g. a Java file will get also changes to the class name) as one commit
do major changes to the file (e.g. refactoring) as a dedicated commit.
For code files I also prefer to separate formatting / changes from actual change so that it's directly visible what part of the logic has changed and this information would get buried within one big change when squashing (AND it makes cherry-picking much easier).