Is it just that you want to avoid breaking existing code that may already be using a proposed new keyword, or is there a deeper reason?
No, that’s the reason.
Keywords, by definition, are always considered keywords wherever they occur in the source, so they cannot be used for other purposes. Making something a keyword breaks any code that might be using that token as a variable, function, or type name.
The C committee take a different approach and add new keywords using _Reserved names, e.g. _Atomic, _Bool, and then they add a new header (<stdatomic.h>, <stdbool.h>) with a nicer macro, so that you can choose whether to include the header to get the name atomic or bool, but it won’t be declared automatically and won’t break code that happens to be using those names already.
The C++ committee don’t like macros and want them to be proper keywords, so either re-use existing ones (such as auto) or add context-dependent “keywords” (which are not really keywords, but are “identifiers with special meaning” so they can be used for other things, such as override) or use strange spellings that are unlikely to clash with user code (such as decltype instead of the widely supported typeof extension).