I just spent some time reviewing the use of XFIXNAT, after being bitten by this code in fileio.c: if (FIXNUMP (tem)) nextpos = XFIXNAT (tem); In the following cases, negative numbers passed to APIs which aren't strictly internal or low-level cause us to call XFIXNAT on a negative number: (indent-to -100 -100) (set-text-properties -1 -1 nil "") (make-network-process :name "name" :family 'ipv6 :remote [-1 0 0 0 0 0 0 0 0]) (end-kbd-macro -1 nil) (previous-single-property-change (point) 'dummy nil -1) I think those six cases are worth fixing, but more generally, I think it would help avoid such errors if XFIXNAT were "always" paired with FIXNATP, XFIXNUM with FIXNUMP, and XCHARACTER (which would be new) with CHARACTERP. So I'm going to be brave here and admit that in many cases, while XFIXNUM was correct, it took me a long time to see that because the check was performed somewhere else. I understand there is a very slight performance hit on some platforms, but is that really still an issue? Also, consistent pairing would catch a few cases in which we call XFIXNUM but could get away with an XFIXNAT, such as this code in self-insert-command: if (!CHARACTERP (c)) bitch_at_user (); else { int character = translate_char (Vtranslation_table_for_input, XFIXNUM (c)); I also think it would make sense to eassume (FIXNUMP (a)) in both XFIXNAT and XFIXNUM (but not XHASH, or XUFIXNUM if that's what XHASH uses). It might catch bugs like (set-text-properties nil nil nil "") currently not throwing an error. The patch I'm attaching fixes only things I'm reasonably sure are bugs.