Problems caused by reserving restrict and inline are pretty easy to fix (since the program will no longer compile), problems caused by reserving typenames are not.
This is supported by the official C99 rationale (emphasis mine):
It is recognized that each added keyword will require some existing code that used it as an identifier to be rewritten. No meaningful programs are known to be quietly changed by adding the new keywords.
restrict and inline can never appear in a place where we could have a user-defined typename in C99:
In the case of restrict: T *restrict name; The only things that can appear here are qualifiers, such as const or volatile, so no existing programs in C would have been using restrict here.
In the case of inline: inline T name(params...); Once again, a typename cannot appear here.
The only programs that could be broken by reserving these can cause are things that use restrict or inline as an identifier or typename, which are both easy to fix, since the program will not compile at all:
e.g. int restrict = 10;. (just rename it)
With types (bool, complex, etc) however, you can get much bigger problems:
Say you have a bit of code that was built with C89, and used complex as an (incomplete) typename:
void f(complex* a, complex* b, complex* out);
Now, if we change the meaning of complex in C99, we can silently break this program in a way that's harder to fix: The code including the header thinks complex refers to our shiny new C99 type, whereas the version of f in our TU that we compiled with our C89 compiler thinks that complex refers to some user-defined type. This can then break at runtime, possibly much later, and be much more painful to track down and fix.
The C rationale also provides an additional justification for complex and imaginary specifically:
_Complex and _Imaginary, not complex and imaginary, are keywords in order that freestanding implementations are not required to support complex. Old code using the names complex or imaginary will still work (assuming <complex.h> is not included), and combined C/C++ implementations will not have to finesse C-only public keywords.
Regarding why the C11 keywords all use underscores, my guess would be the committee has gotten stricter about backwards compatibility since C99 (since technically restrict and inline are breaking changes).