Regarding the identifier cache, is the cost for a cache miss proportional to the number of identifiers in an object? That could be a possible reason for excluding them.
It depends; for a "fixed" program (ie fully compiled) it's a binary search (cf program.c:low_find_shared_string_identifier()), for programs that are being compiled it's a linear search (cf program.c:really_low_find_shared_string_identifier()). Having the threshold for the lookup cache at 9 identifiers seems reasonable.