Ranges of enum members that dwim
Probably, you could do something similar by ... and succ.

enum Foo ( XA =&gt; 17, XB =&gt; 19, XC =&gt; 2, XD =&gt; 17, XE =&gt; 1, XF =&gt; 99 );
enum Goo &lt; YA YB &gt;;
XC, *.succ ... XE andthen .say


Thus your example could be rewritten

use Test;

subset EnumMember of Enumeration; 

multi sub infix:&lt;..&gt;( EnumMember:D ::T $a, T:D $b ) {
    $a, *.succ ... $b 
}

multi sub infix:&lt;..&gt;( EnumMember $a,  $b ) {
    die 'Can only do ranges for members of the same enum' 
}

enum Foo ( XA =&gt; 17, XB =&gt; 19, XC =&gt; 2, XD =&gt; 17, XE =&gt; 1, XF =&gt; 99 );
enum Goo &lt; YA YB &gt;;

is-deeply( ( XC..XE ).Array, [XC, XD, XE] ); 
dies-ok({ XA..YB }); 


But you get Seq, not Range. So I prefer redefine the sequence operator ... and make a new role instead of a subtype.

use Test;

role EnumMember {}; 

multi sub infix:&lt;...&gt;( EnumMember:D ::T $a, T:D $b ) {
    $a, *.succ ... $b 
}

multi sub infix:&lt;...&gt;( EnumMember $a,  $b ) {
    fail 'Can only do sequence for members of the same enum' 
}

multi sub infix:&lt;…&gt;( EnumMember $a,  $b ) {
  $a ... $b
}

enum Foo does EnumMember ( XA =&gt; 17, XB =&gt; 19, XC =&gt; 2, XD =&gt; 17, XE =&gt; 1, XF =&gt; 99 );
enum Goo does EnumMember &lt; YA YB &gt;;

is (XC … XE), (XC, XD, XE); 
dies-ok { XA … YB };