diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 723d094..df91f96 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -570,21 +570,21 @@
     return new DexDebugInfo(start, parameters, events.toArray(DexDebugEvent.EMPTY_ARRAY));
   }
 
-  private static class MemberAnnotationIterator<S extends DexMember<?, S>, T extends DexItem> {
+  private static class MemberAnnotationIterator<R extends DexMember<?, R>, T extends DexItem> {
 
     private int index = 0;
-    private final DexMemberAnnotation<S, T>[] annotations;
+    private final DexMemberAnnotation<R, T>[] annotations;
     private final Supplier<T> emptyValue;
 
-    private MemberAnnotationIterator(DexMemberAnnotation<S, T>[] annotations,
-        Supplier<T> emptyValue) {
+    private MemberAnnotationIterator(
+        DexMemberAnnotation<R, T>[] annotations, Supplier<T> emptyValue) {
       this.annotations = annotations;
       this.emptyValue = emptyValue;
     }
 
     // Get the annotation set for an item. This method assumes that it is always called with
     // an item that is higher in the sorting order than the last item.
-    T getNextFor(S item) {
+    T getNextFor(R item) {
       // TODO(ager): We could use the indices from the file to make this search faster using
       // compareTo instead of slowCompareTo. That would require us to assign indices during
       // reading. Those indices should be cleared after reading to make sure that we resort
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index 48c7c39..8b0cd00 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -577,9 +577,9 @@
     }
   }
 
-  private <S extends DexEncodedMember<S, T>, T extends DexMember<S, T>> void writeMemberAnnotations(
-      List<S> items, ToIntFunction<S> getter) {
-    for (S item : items) {
+  private <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> void writeMemberAnnotations(
+      List<D> items, ToIntFunction<D> getter) {
+    for (D item : items) {
       dest.putInt(item.toReference().getOffset(mapping));
       dest.putInt(getter.applyAsInt(item));
     }
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
index 75ec9be..2d0667b 100644
--- a/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
@@ -107,8 +107,8 @@
     throw new Unreachable();
   }
 
-  private static <S extends DexEncodedMember<S, T>, T extends DexMember<S, T>> boolean isSorted(
-      List<S> items) {
+  private static <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> boolean isSorted(
+      List<D> items) {
     return isSorted(items, DexEncodedMember::toReference);
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 9ce30c1..6dac57d 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -611,9 +611,9 @@
         && method.method.proto.parameters.values[0] != factory.objectArrayType;
   }
 
-  private <T extends DexEncodedMember<T, S>, S extends DexMember<T, S>> T lookupTarget(
-      T[] items, S descriptor) {
-    for (T entry : items) {
+  private <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> D lookupTarget(
+      D[] items, R descriptor) {
+    for (D entry : items) {
       if (descriptor.match(entry)) {
         return entry;
       }
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
index c63aa9f..0e436d6 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMember.java
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-public abstract class DexEncodedMember<S extends DexEncodedMember<S, T>, T extends DexMember<S, T>>
+public abstract class DexEncodedMember<D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
     extends DexDefinition {
 
   public DexEncodedMember(DexAnnotationSet annotations) {
@@ -11,7 +11,7 @@
   }
 
   @Override
-  public abstract T toReference();
+  public abstract R toReference();
 
   @Override
   public boolean isDexEncodedMember() {
@@ -19,7 +19,7 @@
   }
 
   @Override
-  public DexEncodedMember<S, T> asDexEncodedMember() {
+  public DexEncodedMember<D, R> asDexEncodedMember() {
     return this;
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexMember.java b/src/main/java/com/android/tools/r8/graph/DexMember.java
index c1be814..96afd57 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMember.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMember.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-public abstract class DexMember<T extends DexEncodedMember<T, S>, S extends DexMember<T, S>>
-    extends DexReference implements PresortedComparable<S> {
+public abstract class DexMember<D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
+    extends DexReference implements PresortedComparable<R> {
 
   public final DexType holder;
 
@@ -12,9 +12,9 @@
     this.holder = holder;
   }
 
-  public abstract boolean match(S entry);
+  public abstract boolean match(R entry);
 
-  public abstract boolean match(T entry);
+  public abstract boolean match(D entry);
 
   @Override
   public boolean isDexMember() {
@@ -22,7 +22,7 @@
   }
 
   @Override
-  public DexMember<T, S> asDexMember() {
+  public DexMember<D, R> asDexMember() {
     return this;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java
index b44992a..d9868a5 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java
@@ -6,12 +6,12 @@
 import com.android.tools.r8.dex.IndexedItemCollection;
 import com.android.tools.r8.dex.MixedSectionCollection;
 
-public class DexMemberAnnotation<T extends DexMember<?, ?>, S extends DexItem> extends DexItem {
+public class DexMemberAnnotation<R extends DexMember<?, R>, S extends DexItem> extends DexItem {
 
-  public final T item;
+  public final R item;
   public final S annotations;
 
-  public DexMemberAnnotation(T item, S annotations) {
+  public DexMemberAnnotation(R item, S annotations) {
     this.item = item;
     this.annotations = annotations;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index 38aac2b..78a59c2 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -352,10 +352,10 @@
         && isSorted(instanceFields);
   }
 
-  private static <S extends DexEncodedMember<S, T>, T extends DexMember<S, T>> boolean isSorted(
-      S[] items) {
+  private static <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> boolean isSorted(
+      D[] items) {
     synchronized (items) {
-      S[] sorted = items.clone();
+      D[] sorted = items.clone();
       Arrays.sort(sorted, Comparator.comparing(DexEncodedMember::toReference));
       return Arrays.equals(items, sorted);
     }
diff --git a/src/main/java/com/android/tools/r8/graph/PresortedComparable.java b/src/main/java/com/android/tools/r8/graph/PresortedComparable.java
index 2dc3a3b..075c187 100644
--- a/src/main/java/com/android/tools/r8/graph/PresortedComparable.java
+++ b/src/main/java/com/android/tools/r8/graph/PresortedComparable.java
@@ -10,8 +10,8 @@
 
 public interface PresortedComparable<T> extends Presorted, Comparable<T> {
 
-  static <T extends DexEncodedMember<T, S>, S extends DexMember<T, S>> boolean isSorted(
-      List<? extends DexEncodedMember<T, S>> items) {
+  static <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> boolean isSorted(
+      List<? extends DexEncodedMember<D, R>> items) {
     return isSorted(items, DexEncodedMember::toReference);
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java
index 97a8de6..6e53d40 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberPoolCollection.java
@@ -28,13 +28,13 @@
 import java.util.function.Predicate;
 
 // Per-class collection of member signatures.
-public abstract class MemberPoolCollection<T extends DexMember> {
+public abstract class MemberPoolCollection<R extends DexMember<?, R>> {
 
-  final Equivalence<T> equivalence;
+  final Equivalence<R> equivalence;
   final AppView<AppInfoWithLiveness> appView;
-  final Map<DexClass, MemberPool<T>> memberPools = new ConcurrentHashMap<>();
+  final Map<DexClass, MemberPool<R>> memberPools = new ConcurrentHashMap<>();
 
-  MemberPoolCollection(AppView<AppInfoWithLiveness> appView, Equivalence<T> equivalence) {
+  MemberPoolCollection(AppView<AppInfoWithLiveness> appView, Equivalence<R> equivalence) {
     this.appView = appView;
     this.equivalence = equivalence;
   }
@@ -56,7 +56,7 @@
     }
   }
 
-  public MemberPool<T> buildForHierarchy(
+  public MemberPool<R> buildForHierarchy(
       DexClass clazz, ExecutorService executorService, Timing timing) throws ExecutionException {
     timing.begin("Building member pool collection");
     try {
@@ -75,14 +75,14 @@
     return memberPools.containsKey(clazz);
   }
 
-  public MemberPool<T> get(DexClass clazz) {
+  public MemberPool<R> get(DexClass clazz) {
     assert hasPool(clazz);
     return memberPools.get(clazz);
   }
 
-  public boolean markIfNotSeen(DexClass clazz, T reference) {
-    MemberPool<T> memberPool = get(clazz);
-    Wrapper<T> key = equivalence.wrap(reference);
+  public boolean markIfNotSeen(DexClass clazz, R reference) {
+    MemberPool<R> memberPool = get(clazz);
+    Wrapper<R> key = equivalence.wrap(reference);
     if (memberPool.hasSeen(key)) {
       return true;
     }
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index ac05da8..c0788fc 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2714,11 +2714,11 @@
     assert replaced == callSites.size();
   }
 
-  private static <S extends DexEncodedMember<S, T>, T extends DexMember<S, T>>
-      SortedSet<T> toSortedDescriptorSet(Set<S> set) {
-    ImmutableSortedSet.Builder<T> builder =
+  private static <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
+      SortedSet<R> toSortedDescriptorSet(Set<D> set) {
+    ImmutableSortedSet.Builder<R> builder =
         new ImmutableSortedSet.Builder<>(PresortedComparable::slowCompareTo);
-    for (S item : set) {
+    for (D item : set) {
       builder.add(item.toReference());
     }
     return builder.build();
@@ -3562,17 +3562,17 @@
     }
   }
 
-  private static final class TargetWithContext<T extends DexMember<?, T>> {
+  private static final class TargetWithContext<R extends DexMember<?, R>> {
 
-    private final T target;
+    private final R target;
     private final DexEncodedMethod context;
 
-    private TargetWithContext(T target, DexEncodedMethod context) {
+    private TargetWithContext(R target, DexEncodedMethod context) {
       this.target = target;
       this.context = context;
     }
 
-    public T getTarget() {
+    public R getTarget() {
       return target;
     }
 
diff --git a/src/main/java/com/android/tools/r8/shaking/TreePruner.java b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
index d0d51aa..05d281b 100644
--- a/src/main/java/com/android/tools/r8/shaking/TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/TreePruner.java
@@ -243,8 +243,8 @@
     return context == null || !isTypeLive(context);
   }
 
-  private <S extends DexEncodedMember<S, T>, T extends DexMember<S, T>> int firstUnreachableIndex(
-      List<S> items, Predicate<S> live) {
+  private <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> int firstUnreachableIndex(
+      List<D> items, Predicate<D> live) {
     for (int i = 0; i < items.size(); i++) {
       if (!live.test(items.get(i))) {
         return i;
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 6646265..783862a 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1269,14 +1269,14 @@
       return null;
     }
 
-    private <S extends DexEncodedMember<S, T>, T extends DexMember<S, T>> void add(
-        Map<Wrapper<T>, S> map, S item, Equivalence<T> equivalence) {
+    private <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> void add(
+        Map<Wrapper<R>, D> map, D item, Equivalence<R> equivalence) {
       map.put(equivalence.wrap(item.toReference()), item);
     }
 
-    private <S extends DexEncodedMember<S, T>, T extends DexMember<S, T>> void addAll(
-        Collection<Wrapper<T>> collection, Iterable<S> items, Equivalence<T> equivalence) {
-      for (S item : items) {
+    private <D extends DexEncodedMember<D, R>, R extends DexMember<D, R>> void addAll(
+        Collection<Wrapper<R>> collection, Iterable<D> items, Equivalence<R> equivalence) {
+      for (D item : items) {
         collection.add(equivalence.wrap(item.toReference()));
       }
     }
diff --git a/src/main/java/com/android/tools/r8/utils/OrderedMergingIterator.java b/src/main/java/com/android/tools/r8/utils/OrderedMergingIterator.java
index 279f737..2458a64 100644
--- a/src/main/java/com/android/tools/r8/utils/OrderedMergingIterator.java
+++ b/src/main/java/com/android/tools/r8/utils/OrderedMergingIterator.java
@@ -10,20 +10,20 @@
 import java.util.List;
 import java.util.NoSuchElementException;
 
-public class OrderedMergingIterator<S extends DexEncodedMember<S, T>, T extends DexMember<S, T>>
-    implements Iterator<S> {
+public class OrderedMergingIterator<D extends DexEncodedMember<D, R>, R extends DexMember<D, R>>
+    implements Iterator<D> {
 
-  private final List<S> one;
-  private final List<S> other;
+  private final List<D> one;
+  private final List<D> other;
   private int oneIndex = 0;
   private int otherIndex = 0;
 
-  public OrderedMergingIterator(List<S> one, List<S> other) {
+  public OrderedMergingIterator(List<D> one, List<D> other) {
     this.one = one;
     this.other = other;
   }
 
-  private S getNextChecked(List<S> list, int position) {
+  private D getNextChecked(List<D> list, int position) {
     if (position >= list.size()) {
       throw new NoSuchElementException();
     }
@@ -36,7 +36,7 @@
   }
 
   @Override
-  public S next() {
+  public D next() {
     if (oneIndex >= one.size()) {
       return getNextChecked(other, otherIndex++);
     }
