diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
index 93b3b47..da35877 100644
--- a/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
+++ b/src/main/java/com/android/tools/r8/graph/GenericSignatureTypeRewriter.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.graph.GenericSignature.TypeSignature;
 import com.android.tools.r8.graph.GenericSignature.WildcardIndicator;
 import com.android.tools.r8.utils.ListUtils;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Function;
 import java.util.function.Predicate;
@@ -25,7 +26,7 @@
   private final DexItemFactory factory;
   private final Predicate<DexType> wasPruned;
   private final Function<DexType, DexType> lookupType;
-  private final DexType context;
+  private final DexProgramClass context;
 
   private final ClassTypeSignature objectTypeSignature;
 
@@ -36,14 +37,14 @@
             ? appView.appInfo().withLiveness()::wasPruned
             : alwaysFalse(),
         appView.graphLens()::lookupType,
-        context.getType());
+        context);
   }
 
   public GenericSignatureTypeRewriter(
       DexItemFactory factory,
       Predicate<DexType> wasPruned,
       Function<DexType, DexType> lookupType,
-      DexType context) {
+      DexProgramClass context) {
     this.factory = factory;
     this.wasPruned = wasPruned;
     this.lookupType = lookupType;
@@ -138,7 +139,9 @@
     @Override
     public ClassTypeSignature visitSuperClass(ClassTypeSignature classTypeSignature) {
       ClassTypeSignature rewritten = classTypeSignature.visit(this);
-      return rewritten == null || rewritten.type() == context ? objectTypeSignature : rewritten;
+      return rewritten == null || rewritten.type() == context.type
+          ? objectTypeSignature
+          : rewritten;
     }
 
     @Override
@@ -147,13 +150,25 @@
       if (interfaceSignatures.isEmpty()) {
         return interfaceSignatures;
       }
-      return ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
+      List<ClassTypeSignature> rewrittenInterfaces =
+          ListUtils.mapOrElse(interfaceSignatures, this::visitSuperInterface);
+      // Map against the actual interfaces implemented on the class for us to still preserve
+      // type arguments.
+      List<ClassTypeSignature> finalInterfaces = new ArrayList<>(rewrittenInterfaces.size());
+      context.interfaces.forEach(
+          iface -> {
+            ClassTypeSignature rewrittenSignature =
+                ListUtils.firstMatching(rewrittenInterfaces, rewritten -> rewritten.type == iface);
+            finalInterfaces.add(
+                rewrittenSignature != null ? rewrittenSignature : new ClassTypeSignature(iface));
+          });
+      return finalInterfaces;
     }
 
     @Override
     public ClassTypeSignature visitSuperInterface(ClassTypeSignature classTypeSignature) {
       ClassTypeSignature rewritten = classTypeSignature.visit(this);
-      return rewritten == null || rewritten.type() == context ? null : rewritten;
+      return rewritten == null || rewritten.type() == context.type ? null : rewritten;
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/utils/ListUtils.java b/src/main/java/com/android/tools/r8/utils/ListUtils.java
index 18ce187..1c260e3 100644
--- a/src/main/java/com/android/tools/r8/utils/ListUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ListUtils.java
@@ -51,6 +51,11 @@
     return list.get(0);
   }
 
+  public static <T> T firstMatching(List<T> list, Predicate<T> tester) {
+    int i = firstIndexMatching(list, tester);
+    return i >= 0 ? list.get(i) : null;
+  }
+
   public static <T> int firstIndexMatching(List<T> list, Predicate<T> tester) {
     for (int i = 0; i < list.size(); i++) {
       if (tester.test(list.get(i))) {
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
index 12a819d..75306f7 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/ClassSignatureTest.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GenericSignature;
 import com.android.tools.r8.graph.GenericSignature.ClassSignature;
+import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
 import com.android.tools.r8.graph.GenericSignaturePrinter;
 import com.android.tools.r8.graph.GenericSignatureTypeRewriter;
 import com.android.tools.r8.naming.NamingLens;
@@ -162,30 +163,29 @@
   public void testPruningInterfaceBound() {
     DexItemFactory factory = new DexItemFactory();
     DexType context = factory.createType("Lj$/util/stream/Node$OfPrimitive;");
-    String className = "j$.util.stream.Node$OfPrimitive";
+    String methodName = "j$.util.stream.Node$OfPrimitive.foo()";
     TestDiagnosticMessagesImpl testDiagnosticMessages = new TestDiagnosticMessagesImpl();
-    ClassSignature parsedClassSignature =
-        GenericSignature.parseClassSignature(
-            className,
-            "<T_SPLITR::Lj$/util/Spliterator$OfPrimitive;T_NODE:Ljava/lang/Object;>"
-                + "Ljava/lang/Object;",
+    MethodTypeSignature parsedMethodSignature =
+        GenericSignature.parseMethodSignature(
+            methodName,
+            "<T_SPLITR::Lj$/util/Spliterator$OfPrimitive;T_NODE:Ljava/lang/Object;>()V",
             Origin.unknown(),
             factory,
             testDiagnosticMessages);
     testDiagnosticMessages.assertNoMessages();
-    assertTrue(parsedClassSignature.hasSignature());
+    assertTrue(parsedMethodSignature.hasSignature());
     GenericSignatureTypeRewriter rewriter =
         new GenericSignatureTypeRewriter(
             factory,
             dexType -> dexType.toDescriptorString().equals("Lj$/util/Spliterator$OfPrimitive;"),
             Function.identity(),
-            context);
-    ClassSignature rewritten = rewriter.rewrite(parsedClassSignature);
+            null);
+    MethodTypeSignature rewritten = rewriter.rewrite(parsedMethodSignature);
     assertNotNull(rewritten);
     assertTrue(rewritten.hasSignature());
-    ClassSignature reparsed =
-        GenericSignature.parseClassSignature(
-            className, rewritten.toString(), Origin.unknown(), factory, testDiagnosticMessages);
+    MethodTypeSignature reparsed =
+        GenericSignature.parseMethodSignature(
+            methodName, rewritten.toString(), Origin.unknown(), factory, testDiagnosticMessages);
     assertTrue(reparsed.hasSignature());
     testDiagnosticMessages.assertNoMessages();
     assertEquals(rewritten.toString(), reparsed.toString());
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesKeepTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesKeepTest.java
index 3595ede..0e09d6a 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesKeepTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesKeepTest.java
@@ -21,8 +21,6 @@
       new String[] {
         "interface com.android.tools.r8.graph.genericsignature"
             + ".GenericSignaturePrunedInterfacesKeepTest$J",
-        "interface com.android.tools.r8.graph.genericsignature"
-            + ".GenericSignaturePrunedInterfacesKeepTest$I",
         "com.android.tools.r8.graph.genericsignature"
             + ".GenericSignaturePrunedInterfacesKeepTest$J<java.lang.Object>"
       };
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesObfuscationTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesObfuscationTest.java
new file mode 100644
index 0000000..7cf462c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesObfuscationTest.java
@@ -0,0 +1,72 @@
+// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.graph.genericsignature;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import java.lang.reflect.Type;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class GenericSignaturePrunedInterfacesObfuscationTest extends TestBase {
+
+  private final TestParameters parameters;
+  private final String[] EXPECTED = new String[] {"interface a.b", "a.b<java.lang.Object>"};
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  public GenericSignaturePrunedInterfacesObfuscationTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8Compat(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(Main.class)
+        .addKeepClassRules(I.class, A.class)
+        .addKeepClassRulesWithAllowObfuscation(J.class)
+        .addKeepAttributeSignature()
+        .addKeepAttributeInnerClassesAndEnclosingMethod()
+        .enableInliningAnnotations()
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines(EXPECTED);
+  }
+
+  public interface I {}
+
+  public interface J<T> {}
+
+  public static class A implements I {}
+
+  public static class B extends A implements I, J<Object> {
+
+    @NeverInline
+    public static void foo() {
+      for (Type genericInterface : B.class.getInterfaces()) {
+        System.out.println(genericInterface);
+      }
+      for (Type genericInterface : B.class.getGenericInterfaces()) {
+        System.out.println(genericInterface);
+      }
+    }
+  }
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      B.foo();
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesTest.java
index 41cc438..85cee97 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignaturePrunedInterfacesTest.java
@@ -22,8 +22,6 @@
       new String[] {
         "interface com.android.tools.r8.graph.genericsignature"
             + ".GenericSignaturePrunedInterfacesTest$J",
-        "interface com.android.tools.r8.graph.genericsignature"
-            + ".GenericSignaturePrunedInterfacesTest$I",
         "com.android.tools.r8.graph.genericsignature"
             + ".GenericSignaturePrunedInterfacesTest$J<java.lang.Object>"
       };
