My assumption is that they both represent valid SQL identifiers, so it stands to reason that `%I` should result in a valid identifier for both of them (or neither one).
All three of the %I results are valid identifiers.
regclass performs the same conversion that %I performs. But since the output of the regclass conversion is a valid identifier, with double-quotes, the %I adds another pair of double-quotes and doubles-up the existing pair thus leaving you with 6.
<select> is a reserved word and thus can only be used as an identifier if it is surrounded in double-quotes. name() doesn't care (not that it is user-documented that I can find) about making its value usable as an identifier so when its output goes through %I you get the expected value.
If you are going to use regclass you want to use %s to insert the result into your string; not %I.