To the end user, they are the same: you will see some messages that you are not suppose to understand;
But to the developers of the compiler, they are different. Normal ICEs like this one, will let you understand that the problem is in a struct called
OutputTypeParameterMismatch(Binder(<[closure@src/main.rs:13:17: 13:24] as std::ops::FnMut<(<Id<()> as Lt<'_>>::T,)>>), Binder(<[closure@src/main.rs:13:17: 13:24] as std::ops::FnMut<((),)>>), Sorts(ExpectedFound { expected: (), found: <Id<()> as Lt<'_>>::T }))` selecting `Binder(<[closure@src/main.rs:13:17: 13:24] as std::ops::FnMut<((),)>>)
and makes the diagnostic and fix much easier. The compiler developers can easily spot out: the compiler was consider () is matching <() as Lt<'_>>::T, but later it didn’t match them. This is inconsistent and so you can dig deeper into it and fix it.
But CUPs on the other hand, if gives you anything ever, it is something that is irrelevant to the program being compiling. This is harder to trace and debug.