| Index: pkg/compiler/lib/src/enqueue.dart
 | 
| diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
 | 
| index 35b564043a071e44417bbeeb9e154a998161d1ed..14b020d0dececdef67c1831c35e48901cb3e362b 100644
 | 
| --- a/pkg/compiler/lib/src/enqueue.dart
 | 
| +++ b/pkg/compiler/lib/src/enqueue.dart
 | 
| @@ -196,7 +196,13 @@ abstract class Enqueuer {
 | 
|        ClassElement cls = type.element;
 | 
|        registry.registerDependency(cls);
 | 
|        cls.ensureResolved(compiler);
 | 
| -      universe.registerTypeInstantiation(type, byMirrors: mirrorUsage);
 | 
| +      universe.registerTypeInstantiation(
 | 
| +          type,
 | 
| +          byMirrors: mirrorUsage,
 | 
| +          onImplemented: (ClassElement cls) {
 | 
| +        compiler.backend.registerImplementedClass(
 | 
| +                    cls, this, compiler.globalDependencies);
 | 
| +      });
 | 
|        processInstantiatedClass(cls);
 | 
|        compiler.backend.registerInstantiatedType(type, registry);
 | 
|      });
 | 
| @@ -322,26 +328,26 @@ abstract class Enqueuer {
 | 
|        // supertypes.
 | 
|        cls.ensureResolved(compiler);
 | 
|  
 | 
| -      void processClass(ClassElement cls) {
 | 
| -        if (_processedClasses.contains(cls)) return;
 | 
| +      void processClass(ClassElement superclass) {
 | 
| +        if (_processedClasses.contains(superclass)) return;
 | 
|  
 | 
| -        _processedClasses.add(cls);
 | 
| -        recentClasses.add(cls);
 | 
| -        cls.ensureResolved(compiler);
 | 
| -        cls.implementation.forEachMember(processInstantiatedClassMember);
 | 
| -        if (isResolutionQueue && !cls.isSynthesized) {
 | 
| -          compiler.resolver.checkClass(cls);
 | 
| +        _processedClasses.add(superclass);
 | 
| +        recentClasses.add(superclass);
 | 
| +        superclass.ensureResolved(compiler);
 | 
| +        superclass.implementation.forEachMember(processInstantiatedClassMember);
 | 
| +        if (isResolutionQueue && !superclass.isSynthesized) {
 | 
| +          compiler.resolver.checkClass(superclass);
 | 
|          }
 | 
| -        // We only tell the backend once that [cls] was instantiated, so
 | 
| +        // We only tell the backend once that [superclass] was instantiated, so
 | 
|          // any additional dependencies must be treated as global
 | 
|          // dependencies.
 | 
|          compiler.backend.registerInstantiatedClass(
 | 
| -            cls, this, compiler.globalDependencies);
 | 
| +            superclass, this, compiler.globalDependencies);
 | 
|        }
 | 
| -      processClass(cls);
 | 
| -      for (Link<DartType> supertypes = cls.allSupertypes;
 | 
| -           !supertypes.isEmpty; supertypes = supertypes.tail) {
 | 
| -        processClass(supertypes.head.element);
 | 
| +
 | 
| +      while (cls != null) {
 | 
| +        processClass(cls);
 | 
| +        cls = cls.superclass;
 | 
|        }
 | 
|      });
 | 
|    }
 | 
| 
 |