diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
index 373853f..0e96364 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/asm/KeepEdgeWriter.java
@@ -9,7 +9,7 @@
 import com.android.tools.r8.keepanno.ast.KeepEdge;
 import com.android.tools.r8.keepanno.ast.KeepItemPattern;
 import com.android.tools.r8.keepanno.ast.KeepMembersPattern;
-import com.android.tools.r8.keepanno.ast.KeepMethodNamePattern;
+import com.android.tools.r8.keepanno.ast.KeepMethodNamePattern.KeepMethodNameExactPattern;
 import com.android.tools.r8.keepanno.ast.KeepMethodPattern;
 import com.android.tools.r8.keepanno.ast.KeepPreconditions;
 import com.android.tools.r8.keepanno.ast.KeepQualifiedClassNamePattern;
@@ -85,15 +85,12 @@
       throw new Unimplemented();
     }
     KeepMethodPattern method = membersPattern.asMethod();
-    KeepMethodNamePattern methodNamePattern = method.getNamePattern();
-    methodNamePattern.match(
-        () -> {
-          throw new Unimplemented();
-        },
-        exactMethodName -> {
-          targetVisitor.visit(Target.methodName, exactMethodName);
-          return null;
-        });
+    KeepMethodNameExactPattern exactMethodName = method.getNamePattern().asExact();
+    if (exactMethodName != null) {
+      targetVisitor.visit(Target.methodName, exactMethodName.getName());
+    } else {
+      throw new Unimplemented();
+    }
     if (!method.getAccessPattern().isAny()) {
       throw new Unimplemented();
     }
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java
index 1a637de..8203d56 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodNamePattern.java
@@ -3,8 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 public abstract class KeepMethodNamePattern {
 
@@ -23,15 +21,16 @@
   private KeepMethodNamePattern() {}
 
   public boolean isAny() {
-    return match(() -> true, ignore -> false);
+    return false;
   }
 
-  public boolean isExact() {
-    return match(() -> false, ignore -> true);
+  public final boolean isExact() {
+    return asExact() != null;
   }
-  ;
 
-  public abstract <T> T match(Supplier<T> onAny, Function<String, T> onExact);
+  public KeepMethodNameExactPattern asExact() {
+    return null;
+  }
 
   private static class Any extends KeepMethodNamePattern {
     private static final Any INSTANCE = new Any();
@@ -41,8 +40,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<String, T> onExact) {
-      return onAny.get();
+    public boolean isAny() {
+      return true;
     }
 
     @Override
@@ -61,7 +60,7 @@
     }
   }
 
-  private static class KeepMethodNameExactPattern extends KeepMethodNamePattern {
+  public static class KeepMethodNameExactPattern extends KeepMethodNamePattern {
     private final String name;
 
     public KeepMethodNameExactPattern(String name) {
@@ -70,8 +69,12 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<String, T> onExact) {
-      return onExact.apply(name);
+    public KeepMethodNameExactPattern asExact() {
+      return this;
+    }
+
+    public String getName() {
+      return name;
     }
 
     @Override
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java
index cd850e6..29442ff 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodParametersPattern.java
@@ -5,8 +5,6 @@
 
 import java.util.Collections;
 import java.util.List;
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 public abstract class KeepMethodParametersPattern {
 
@@ -15,42 +13,55 @@
   }
 
   public static KeepMethodParametersPattern none() {
-    return None.getInstance();
+    return Some.EMPTY_INSTANCE;
   }
 
   private KeepMethodParametersPattern() {}
 
-  public abstract <T> T match(Supplier<T> onAny, Function<List<KeepTypePattern>, T> onList);
-
   public boolean isAny() {
-    return match(() -> true, params -> false);
+    return false;
   }
 
-  private static class None extends KeepMethodParametersPattern {
-    private static final None INSTANCE = new None();
+  public boolean isList() {
+    return asList() != null;
+  }
 
-    public static None getInstance() {
-      return INSTANCE;
+  public List<KeepTypePattern> asList() {
+    return null;
+  }
+
+  private static class Some extends KeepMethodParametersPattern {
+
+    private static final Some EMPTY_INSTANCE = new Some(Collections.emptyList());
+
+    private final List<KeepTypePattern> parameterPatterns;
+
+    private Some(List<KeepTypePattern> parameterPatterns) {
+      assert parameterPatterns != null;
+      this.parameterPatterns = parameterPatterns;
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<List<KeepTypePattern>, T> onList) {
-      return onList.apply(Collections.emptyList());
+    public List<KeepTypePattern> asList() {
+      return parameterPatterns;
     }
 
     @Override
-    public boolean equals(Object obj) {
-      return this == obj;
+    public boolean equals(Object o) {
+      if (this == o) {
+        return true;
+      }
+      if (o == null || getClass() != o.getClass()) {
+        return false;
+      }
+
+      Some that = (Some) o;
+      return parameterPatterns.equals(that.parameterPatterns);
     }
 
     @Override
     public int hashCode() {
-      return System.identityHashCode(this);
-    }
-
-    @Override
-    public String toString() {
-      return "()";
+      return parameterPatterns.hashCode();
     }
   }
 
@@ -62,8 +73,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onAny, Function<List<KeepTypePattern>, T> onList) {
-      return onAny.get();
+    public boolean isAny() {
+      return true;
     }
 
     @Override
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java
index 2786945..ccfc183 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/ast/KeepMethodReturnTypePattern.java
@@ -3,25 +3,31 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.keepanno.ast;
 
-import java.util.function.Function;
-import java.util.function.Supplier;
 
 public abstract class KeepMethodReturnTypePattern {
 
-  private static final SomeType ANY_TYPE_INSTANCE = new SomeType(KeepTypePattern.any());
-
   public static KeepMethodReturnTypePattern any() {
-    return ANY_TYPE_INSTANCE;
+    return SomeType.ANY_TYPE_INSTANCE;
   }
 
   public static KeepMethodReturnTypePattern voidType() {
     return VoidType.getInstance();
   }
 
-  public abstract <T> T match(Supplier<T> onVoid, Function<KeepTypePattern, T> onType);
-
   public boolean isAny() {
-    return match(() -> false, KeepTypePattern::isAny);
+    return isType() && asType().isAny();
+  }
+
+  public boolean isVoid() {
+    return false;
+  }
+
+  public boolean isType() {
+    return asType() != null;
+  }
+
+  public KeepTypePattern asType() {
+    return null;
   }
 
   private static class VoidType extends KeepMethodReturnTypePattern {
@@ -32,8 +38,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onVoid, Function<KeepTypePattern, T> onType) {
-      return onVoid.get();
+    public boolean isVoid() {
+      return true;
     }
 
     @Override
@@ -54,6 +60,8 @@
 
   private static class SomeType extends KeepMethodReturnTypePattern {
 
+    private static final SomeType ANY_TYPE_INSTANCE = new SomeType(KeepTypePattern.any());
+
     private final KeepTypePattern typePattern;
 
     private SomeType(KeepTypePattern typePattern) {
@@ -62,8 +70,8 @@
     }
 
     @Override
-    public <T> T match(Supplier<T> onVoid, Function<KeepTypePattern, T> onType) {
-      return onType.apply(typePattern);
+    public KeepTypePattern asType() {
+      return typePattern;
     }
 
     @Override
diff --git a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
index 2d0df1b..3ab882f 100644
--- a/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
+++ b/src/keepanno/java/com/android/tools/r8/keepanno/keeprules/KeepRuleExtractor.java
@@ -131,24 +131,31 @@
 
   private static StringBuilder printParameters(
       StringBuilder builder, KeepMethodParametersPattern parametersPattern) {
-    return parametersPattern.match(
-        () -> builder.append("(***)"),
-        list ->
-            builder
-                .append('(')
-                .append(list.stream().map(Object::toString).collect(Collectors.joining(", ")))
-                .append(')'));
+    if (parametersPattern.isAny()) {
+      return builder.append("(***)");
+    }
+    return builder
+        .append('(')
+        .append(
+            parametersPattern.asList().stream()
+                .map(Object::toString)
+                .collect(Collectors.joining(", ")))
+        .append(')');
   }
 
   private static StringBuilder printMethodName(
       StringBuilder builder, KeepMethodNamePattern namePattern) {
-    return namePattern.match(() -> builder.append("*"), builder::append);
+    return namePattern.isAny()
+        ? builder.append("*")
+        : builder.append(namePattern.asExact().getName());
   }
 
   private static StringBuilder printReturnType(
       StringBuilder builder, KeepMethodReturnTypePattern returnTypePattern) {
-    return returnTypePattern.match(
-        () -> builder.append("void"), typePattern -> printType(builder, typePattern));
+    if (returnTypePattern.isVoid()) {
+      return builder.append("void");
+    }
+    return printType(builder, returnTypePattern.asType());
   }
 
   private static StringBuilder printType(StringBuilder builder, KeepTypePattern typePattern) {
