Immediate now uses abstract types instead of type params
Improved way of defining instructions