The MPLAB C18 Compiler User's Guide lists a few extra storage qualifiers that appear to be relevant to your use-case:
near
/far
Program Memory Objects
Thefar
qualifier is used to denote that a variable that is located in program memory can be found anywhere in program memory, or, if a pointer, that it can access up to and beyond 64K of program memory space.
ram
/rom
Qualifiers
Therom
qualifier denotes that the object is located in program memory, whereas theram
qualifier denotes that the object is located in data memory.
Later on, the manual shows an example of creating "a function pointer that can access up to a beyond 64K of program memory space":
far rom void (*fp) (void);
The XC8 manual is less clear about the function of the far
qualifier, but still lists it, which strongly suggests that it still is recognized by the newer compilers.