'f' and 'F' are different characters in ASCII, Unicode, or whatever. You have to go out of your way to make them refer to the same thing, and since casing isn't one-to-one for every character, you have to have arbitrary rules: should 'ss', 'SS', and 'ß' be treated interchangeably everywhere?
VHDL, for example, is case insensitive. This means that if I have a simple architecture with a single FSM, and I define a type and a signal for the FSM state like this:
architecture impl of SimpleModule is
type State is (Idle, Busy, Done);
signal state: State;
begin
...
end;
I get an error message for the signal declaration, because the identifier state is already used for the type State. It's easy to fix (for example, using FsmState and fsm_state), but it's just so annoying each and every time.
Because naming conventions are important for code reability.
When I look at a piece of code and I see something like "FOOBAR" I can be quite sure that I am looking at some variable in the global namespace. "FooBar" is most likely a class/struct. `foobar` could be a local name or a function.
Sure, these are conventions and don't need to be observed technically, but they are, because they are useful, same as it's useful to name counter variables in loops "i" instead of "localLoopIterationCounterVariable".
Oh and of course there are languages where case actually does matter syntactically, like Golang.
All of that flies out the window in a language that simply ignores case. And it is at this point where I pose the counter-question: What makes ignoring case in a programming language useful?
Also, inconsistency. The example that they put is SHOWLN and showln, and they use all over the place showln, but then they write ReadLN. Driving me cranky :-)
Grep-ability for one. This would also make Vim's default '*' behavior less useful.
Weird choice, I've programmed in a language that wasn't case sensitive and it's no fun to read legacy code where the casing changes everywhere.