However in the specific case of the handle example: handles, should never, by definition, be amenable to numeric manipulation by application code. If they're compatible with arithmetic types at the level of application code then something's broken... or something is about to be broken when a less-than-experienced coder gets his mitt on it.
That concept is called an opaque type and some languages like Swift or Haskell have them. It's a type the internals of which you do not know about or at best can make some assumptions about (like that it overloades the = and <> operators). C has them also for structs/records but only allows to access them via pointer.
Pascal only has a few very specific opaque types, there are untyped pointers which are a pointer to an opaque type, there is the magical "File" types (like file of XYZ) which are a class of opaque types and then theres Variant which is an implementation specific opaque type.
But Pascal does not have any user definable opaque types. There are simple types, which are basically defined as ordered sets, where Subrange types are defined as subsets of the number plane (and integer, byte, etc. are just instances of that), real types and enumeration types. And then there are composite types like arrays and records.
Now opaque types can be added to this mix, but the question is how the opaque type should be handled. Because Pascal is a relatively low level language, unlike for example Haskell or Swift, there needs to be the decision if the opaque type should fix memory layout or fix interfaces.
Extended Pascal has introduced an opaque typesystem called Schemata, afaik it was never put into practice, but at it's core it's a mix between interfaces and generics. It can be resolved during compile time like generics, or at runtime using pointers (in theory, as I said theres probably no real implementation out there).
But this would not be quite fitting for Handles as Schemata do not define the memory layout but only the interfaces of the type (like opaque types in Swift or go).
What handles would need would be some information about the memory layout but no information about the interface. Basically just a "Binary blob" type. Which would technically be possible to implement, but why not just use:
TMyHandle = record data: array[0..HANDLESIZE-1] of Byte end;
Now you have created a new type which has absolutely no defined interface other than it is assignable to itself and allowing raw byte access.
If you need additional interfaces you can define them yourself (e.g. by overloading the explicit cast operator and/or the comparison operators = and <>).
So I do not see why you would need to introduce a new kind of type to the language.