diff --git a/src/core/Exception.pm b/src/core/Exception.pm
index d2696dd..b2bbee3 100644
--- a/src/core/Exception.pm
+++ b/src/core/Exception.pm
@@ -153,55 +153,80 @@ my class X::Method::NotFound is Exception {
     has $.typename;
     has Bool $.private = False;
     method message() {
-        my $message = $.private
-          ?? "No such private method '$.method' for invocant of type '$.typename'"
-          !! "No such method '$.method' for invocant of type '$.typename'";
-
-        my %suggestions;
-        my int $max_length = do given $.method.chars {
-            when 0..3 { 1 }
-            when 4..8 { 2 }
-            when 9..* { 3 }
-        }
-
-        if $.method eq 'length' {
-            given $!invocant {
-                when List { %suggestions{$_} = 0 for <elems> }
-                when Cool { %suggestions{$_} = 0 for <chars codes>; }
-                default   { %suggestions{$_} = 0 for <elems chars codes>; }
-            }
-            
-        }
-        elsif $.method eq 'bytes' {
-            %suggestions<encode($encoding).bytes> = 0;
-        }
-
-        if nqp::can($!invocant.HOW, 'methods') {
-            for $!invocant.^methods(:all)>>.name -> $method_name {
-                my $dist = StrDistance.new(:before($.method), :after($method_name));
-                if $dist <= $max_length {
-                    %suggestions{$method_name} = $dist;
-                }
-            }
-        }
-
-        if nqp::can($!invocant.HOW, 'private_method_table') {
-            for $!invocant.^private_method_table.keys -> $method_name {
-                my $dist = StrDistance.new(:before($.method), :after($method_name));
-                if $dist <= $max_length {
-                    %suggestions{"!$method_name"} = $dist;
-                }
-            }
-        }
-
-        if +%suggestions == 1 {
-            $message ~= ". Did you mean '%suggestions.keys()'?";
-        }
-        elsif +%suggestions > 1 {
-            $message ~= ". Did you mean any of these?\n    { %suggestions.sort(*.value)>>.key.head(4).join("\n    ") }\n";
-        }
-
-        $message;
+        my $suggestions := nqp::hash;
+        nqp::if(
+          nqp::iseq_s($!method, 'length'),
+          nqp::if(
+            nqp::istype($!invocant, List),
+            nqp::bindkey($suggestions, 'elems', 0),
+            nqp::stmts(
+              nqp::bindkey($suggestions, 'chars', 0),
+              nqp::bindkey($suggestions, 'codes', 0),
+              nqp::unless(
+                nqp::istype($!invocant, Cool),
+                nqp::bindkey($suggestions, 'elems', 0)))),
+          nqp::if(
+            nqp::iseq_s($!method, 'bytes'),
+            nqp::bindkey($suggestions, 'encode($encoding).bytes', 0)));
+
+        my int $max-length = nqp::if(
+          nqp::isle_i((my int $meth-len = nqp::chars($!method)), 3), 1,
+            nqp::if(nqp::isle_i($meth-len, 8), 2, 3));
+
+        nqp::if(
+          nqp::can($!invocant.HOW, 'methods'),
+          nqp::stmts(
+            (my @meths = $!invocant.^methods: :all),
+            (my int $els = @meths.elems),
+            (my int $i   = -1),
+            nqp::while(
+              nqp::islt_i($els, $i = nqp::add_i($i, 1)),
+              nqp::stmts(
+                (my str $meth-name = @meths.AT-POS($i).name),
+                (my int $distance  = StrDistance.new:
+                  :before($!method), :after($meth-name)),
+                nqp::if(
+                  nqp::isle_i($distance, $max-length),
+                  nqp::bindkey($suggestions, $meth-name, $distance))))));
+
+        nqp::if(
+          nqp::can($!invocant.HOW, 'private_method_table'),
+          nqp::stmts(
+            (@meths = $!invocant.^private_method_table.keys),
+            ($els = @meths.elems),
+            ($i   = -1),
+            nqp::while(
+              nqp::islt_i($els, $i = nqp::add_i($i, 1)),
+              nqp::stmts(
+                ($meth-name = @meths.AT-POS($i).name),
+                ($distance  = StrDistance.new:
+                  :before($!method), :after($meth-name)),
+                nqp::if(
+                  nqp::isle_i($distance, $max-length),
+                  nqp::bindkey($suggestions, "!$meth-name", $distance))))));
+
+        nqp::concat(
+          'No such ',
+          nqp::concat(
+            nqp::if($!private, 'private', ''),
+            nqp::concat(
+              " method '$!method' for invocant of type '$!typename'",
+              nqp::if(
+                nqp::iseq_i(nqp::elems($suggestions), 1),
+                nqp::concat(
+                  ". Did you mean '",
+                  nqp::concat(
+                    nqp::iterkey_s(nqp::shift(nqp::iterator($suggestions))),
+                    "'?")),
+                nqp::if(
+                  nqp::isgt_i(nqp::elems($suggestions), 1),
+                  nqp::concat(
+                    ". Did you mean any of these?\n    ",
+                    nqp::concat(
+                      (|$suggestions).sort(*.value)
+                        .map(*.key).head(4).join("\n    "),
+                      "\n")),
+                  '.')))))
     }
 }
 
@@ -2199,7 +2224,7 @@ my class X::Assignment::RO is Exception {
     method message {
         "Cannot modify an immutable {$.value.^name} ({$.value.gist})"
     }
-    method typename { $.value.^name } 
+    method typename { $.value.^name }
 }
 
 my class X::Assignment::RO::Comp does X::Comp {
