I'm slightly puzzled that I couldn't write when(18..23), though.
If you're used to Perl 6 switches, you're going to notice breakages in Perl 5 switches because Perl 5 doesn't natively support types such as Range or Junction, nor does it automatically promote a list in scalar context to an array. Instead, it tends to throw away information.
And arguably the Perl 5 behavior with an array is wrong (or would be wrong in Perl 6); in P6 arrays are matched as a whole, and you must use something like any() to match against any element of an array (see the section on Smart Matching in Synopsis 3).
Range objects in P6 are matched directly against their endpoints though, so you don't have to convert to a list and then use any(). In essence, P5 smart matching cannot really emulate P6 smart matching because P5 doesn't have the type system to support it transparently.