diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8ece77f..519256a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 1.14.4
+
+* Add implementation stubs of upcoming Dart 2.0 core library methods, namely
+  new methods for classes that implement Iterable, List, Map, Queue, and Set.
+
+## 1.14.3
+
+* Fix MapKeySet.lookup to be a valid override in strong mode.
+
+## 1.14.2
+
+* Add type arguments to SyntheticInvocation.
+
 ## 1.14.1
 
 * Make `Equality` implementations accept `null` as argument to `hash`.
diff --git a/lib/src/canonicalized_map.dart b/lib/src/canonicalized_map.dart
index a8af43a..122bb35 100644
--- a/lib/src/canonicalized_map.dart
+++ b/lib/src/canonicalized_map.dart
@@ -69,6 +69,18 @@
     other.forEach((key, value) => this[key] = value);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('addEntries');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _base.clear();
   }
@@ -81,6 +93,13 @@
   bool containsValue(Object value) =>
       _base.values.any((pair) => pair.last == value);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('entries');
+  }
+
   void forEach(void f(K key, V value)) {
     _base.forEach((key, pair) => f(pair.first, pair.last));
   }
@@ -93,6 +112,13 @@
 
   int get length => _base.length;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('map');
+  }
+
   V putIfAbsent(K key, V ifAbsent()) {
     return _base
         .putIfAbsent(_canonicalize(key), () => new Pair(key, ifAbsent()))
@@ -105,6 +131,26 @@
     return pair == null ? null : pair.last;
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError('removeWhere');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError('retype');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError('update');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError('updateAll');
+  }
+
   Iterable<V> get values => _base.values.map((pair) => pair.last);
 
   String toString() => Maps.mapToString(this);
diff --git a/lib/src/empty_unmodifiable_set.dart b/lib/src/empty_unmodifiable_set.dart
index ea00959..b3d29ec 100644
--- a/lib/src/empty_unmodifiable_set.dart
+++ b/lib/src/empty_unmodifiable_set.dart
@@ -20,9 +20,14 @@
 
   const EmptyUnmodifiableSet();
 
+  EmptyUnmodifiableSet<T> cast<T>() => const EmptyUnmodifiableSet<T>();
   bool contains(Object element) => false;
   bool containsAll(Iterable<Object> other) => other.isEmpty;
+  Iterable<E> followedBy(Iterable<E> other) => new Set.from(other);
   E lookup(Object element) => null;
+  EmptyUnmodifiableSet<T> retype<T>() => const EmptyUnmodifiableSet<T>();
+  E singleWhere(bool test(E element), {E orElse()}) => super.singleWhere(test);
+  Iterable<T> whereType<T>() => const EmptyUnmodifiableSet<T>();
   Set<E> toSet() => new Set();
   Set<E> union(Set<E> other) => new Set.from(other);
   Set<E> intersection(Set<Object> other) => new Set();
diff --git a/lib/src/queue_list.dart b/lib/src/queue_list.dart
index 7f10261..224ac86 100644
--- a/lib/src/queue_list.dart
+++ b/lib/src/queue_list.dart
@@ -80,6 +80,16 @@
     }
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  QueueList<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  QueueList<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   String toString() => IterableBase.iterableToFullString(this, "{", "}");
 
   // Queue interface.
diff --git a/lib/src/typed_wrappers.dart b/lib/src/typed_wrappers.dart
index 118a614..cef2a58 100644
--- a/lib/src/typed_wrappers.dart
+++ b/lib/src/typed_wrappers.dart
@@ -21,6 +21,11 @@
 
   bool any(bool test(E element)) => _base.any(_validate(test));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) => _base.contains(element);
 
   E elementAt(int index) => _base.elementAt(index) as E;
@@ -38,6 +43,11 @@
       _base.fold(initialValue,
           (previousValue, element) => combine(previousValue, element as E));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<E> followedBy(Iterable<E> other) {
+    throw new UnimplementedError('followedBy');
+  }
+
   void forEach(void f(E element)) => _base.forEach(_validate(f));
 
   bool get isEmpty => _base.isEmpty;
@@ -60,10 +70,17 @@
   E reduce(E combine(E value, E element)) =>
       _base.reduce((value, element) => combine(value as E, element as E)) as E;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E get single => _base.single as E;
 
-  E singleWhere(bool test(E element)) =>
-      _base.singleWhere(_validate(test)) as E;
+  E singleWhere(bool test(E element), {E orElse()}) {
+    if (orElse != null) throw new UnimplementedError('singleWhere:orElse');
+    return _base.singleWhere(_validate(test)) as E;
+  }
 
   Iterable<E> skip(int n) => new TypeSafeIterable<E>(_base.skip(n));
 
@@ -83,6 +100,11 @@
   Iterable<E> where(bool test(E element)) =>
       new TypeSafeIterable<E>(_base.where(_validate(test)));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> whereType<T>() {
+    throw new UnimplementedError('whereType');
+  }
+
   String toString() => _base.toString();
 
   /// Returns a version of [function] that asserts that its argument is an
@@ -116,6 +138,11 @@
     _listBase[index] = value;
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<E> operator +(List<E> other) {
+    throw new UnimplementedError('+');
+  }
+
   void add(E value) {
     _listBase.add(value);
   }
@@ -126,6 +153,11 @@
 
   Map<int, E> asMap() => new TypeSafeMap<int, E>(_listBase.asMap());
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _listBase.clear();
   }
@@ -134,11 +166,22 @@
     _listBase.fillRange(start, end, fillValue);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set first(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[0] = value;
+  }
+
   Iterable<E> getRange(int start, int end) =>
       new TypeSafeIterable<E>(_listBase.getRange(start, end));
 
   int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int indexWhere(bool test(E element), [int start = 0]) {
+    throw new UnimplementedError('indexWhere');
+  }
+
   void insert(int index, E element) {
     _listBase.insert(index, element);
   }
@@ -147,9 +190,20 @@
     _listBase.insertAll(index, iterable);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set last(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[this.length - 1] = value;
+  }
+
   int lastIndexOf(E element, [int start]) =>
       _listBase.lastIndexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int lastIndexWhere(bool test(E element), [int start]) {
+    throw new UnimplementedError('lastIndexWhere');
+  }
+
   set length(int newLength) {
     _listBase.length = newLength;
   }
@@ -176,6 +230,11 @@
     _listBase.retainWhere(_validate(test));
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<E> get reversed => new TypeSafeIterable<E>(_listBase.reversed);
 
   void setAll(int index, Iterable<E> iterable) {
@@ -217,6 +276,11 @@
     _setBase.addAll(elements);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _setBase.clear();
   }
@@ -249,6 +313,11 @@
     _setBase.retainWhere(_validate(test));
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   Set<E> union(Set<E> other) => new TypeSafeSet<E>(_setBase.union(other));
 }
 
@@ -278,6 +347,11 @@
     _baseQueue.addLast(value);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _baseQueue.clear();
   }
@@ -292,6 +366,11 @@
     _baseQueue.retainWhere(_validate(test));
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E removeFirst() => _baseQueue.removeFirst() as E;
 
   E removeLast() => _baseQueue.removeLast() as E;
@@ -316,6 +395,18 @@
     _base.addAll(other);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('addEntries');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _base.clear();
   }
@@ -324,6 +415,13 @@
 
   bool containsValue(Object value) => _base.containsValue(value);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('entries');
+  }
+
   void forEach(void f(K key, V value)) {
     _base.forEach((key, value) => f(key as K, value as V));
   }
@@ -336,11 +434,38 @@
 
   int get length => _base.length;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('map');
+  }
+
   V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent) as V;
 
   V remove(Object key) => _base.remove(key) as V;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError('removeWhere');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<V> get values => new TypeSafeIterable<V>(_base.values);
 
   String toString() => _base.toString();
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError('update');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError('updateAll');
+  }
 }
diff --git a/lib/src/unmodifiable_wrappers.dart b/lib/src/unmodifiable_wrappers.dart
index 070ab78..b0b5440 100644
--- a/lib/src/unmodifiable_wrappers.dart
+++ b/lib/src/unmodifiable_wrappers.dart
@@ -168,4 +168,12 @@
   /// Throws an [UnsupportedError];
   /// operations that change the map are disallowed.
   void clear() => _throw();
+
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
+  set first(_) => _throw();
+
+  /// Throws an [UnsupportedError];
+  /// operations that change the map are disallowed.
+  set last(_) => _throw();
 }
diff --git a/lib/src/wrappers.dart b/lib/src/wrappers.dart
index c3f6438..1abfd45 100644
--- a/lib/src/wrappers.dart
+++ b/lib/src/wrappers.dart
@@ -21,6 +21,11 @@
 
   bool any(bool test(E element)) => _base.any(test);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) => _base.contains(element);
 
   E elementAt(int index) => _base.elementAt(index);
@@ -37,6 +42,11 @@
   T fold<T>(T initialValue, T combine(T previousValue, E element)) =>
       _base.fold(initialValue, combine);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<E> followedBy(Iterable<E> other) {
+    throw new UnimplementedError('followedBy');
+  }
+
   void forEach(void f(E element)) => _base.forEach(f);
 
   bool get isEmpty => _base.isEmpty;
@@ -58,9 +68,17 @@
 
   E reduce(E combine(E value, E element)) => _base.reduce(combine);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E get single => _base.single;
 
-  E singleWhere(bool test(E element)) => _base.singleWhere(test);
+  E singleWhere(bool test(E element), {E orElse()}) {
+    if (orElse != null) throw new UnimplementedError('singleWhere:orElse');
+    return _base.singleWhere(test);
+  }
 
   Iterable<E> skip(int n) => _base.skip(n);
 
@@ -76,6 +94,11 @@
 
   Iterable<E> where(bool test(E element)) => _base.where(test);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<T> whereType<T>() {
+    throw new UnimplementedError("whereType");
+  }
+
   String toString() => _base.toString();
 }
 
@@ -133,6 +156,11 @@
     _listBase[index] = value;
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<E> operator +(List<E> other) {
+    throw new UnimplementedError('+');
+  }
+
   void add(E value) {
     _listBase.add(value);
   }
@@ -143,6 +171,11 @@
 
   Map<int, E> asMap() => _listBase.asMap();
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _listBase.clear();
   }
@@ -151,10 +184,21 @@
     _listBase.fillRange(start, end, fillValue);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set first(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[0] = value;
+  }
+
   Iterable<E> getRange(int start, int end) => _listBase.getRange(start, end);
 
   int indexOf(E element, [int start = 0]) => _listBase.indexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int indexWhere(bool test(E element), [int start = 0]) {
+    throw new UnimplementedError('indexWhere');
+  }
+
   void insert(int index, E element) {
     _listBase.insert(index, element);
   }
@@ -163,9 +207,20 @@
     _listBase.insertAll(index, iterable);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  set last(E value) {
+    if (this.isEmpty) throw new RangeError.index(0, this);
+    this[this.length - 1] = value;
+  }
+
   int lastIndexOf(E element, [int start]) =>
       _listBase.lastIndexOf(element, start);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  int lastIndexWhere(bool test(E element), [int start]) {
+    throw new UnimplementedError('lastIndexWhere');
+  }
+
   set length(int newLength) {
     _listBase.length = newLength;
   }
@@ -192,6 +247,11 @@
     _listBase.retainWhere(test);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  List<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<E> get reversed => _listBase.reversed;
 
   void setAll(int index, Iterable<E> iterable) {
@@ -242,6 +302,11 @@
     _setBase.addAll(elements);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _setBase.clear();
   }
@@ -268,6 +333,11 @@
     _setBase.retainAll(elements);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   void retainWhere(bool test(E element)) {
     _setBase.retainWhere(test);
   }
@@ -317,6 +387,11 @@
     _baseQueue.addLast(value);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   void clear() {
     _baseQueue.clear();
   }
@@ -331,6 +406,11 @@
     _baseQueue.retainWhere(test);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Queue<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   E removeFirst() => _baseQueue.removeFirst();
 
   E removeLast() => _baseQueue.removeLast();
@@ -370,14 +450,33 @@
     _base.addAll(other);
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void addEntries(Iterable<Object> entries) {
+    // Change Iterable<Object> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('addEntries');
+  }
+
   void clear() {
     _base.clear();
   }
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> cast<K2, V2>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool containsKey(Object key) => _base.containsKey(key);
 
   bool containsValue(Object value) => _base.containsValue(value);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Iterable<Null> get entries {
+    // Change Iterable<Null> to Iterable<MapEntry<K, V>> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('entries');
+  }
+
   void forEach(void f(K key, V value)) {
     _base.forEach(f);
   }
@@ -390,13 +489,40 @@
 
   int get length => _base.length;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> map<K2, V2>(Object transform(K key, V value)) {
+    // Change Object to MapEntry<K2, V2> when
+    // the MapEntry class has been added.
+    throw new UnimplementedError('map');
+  }
+
   V putIfAbsent(K key, V ifAbsent()) => _base.putIfAbsent(key, ifAbsent);
 
   V remove(Object key) => _base.remove(key);
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void removeWhere(bool test(K key, V value)) {
+    throw new UnimplementedError('removeWhere');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Map<K2, V2> retype<K2, V2>() {
+    throw new UnimplementedError('retype');
+  }
+
   Iterable<V> get values => _base.values;
 
   String toString() => _base.toString();
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  V update(K key, V update(V value), {V ifAbsent()}) {
+    throw new UnimplementedError('update');
+  }
+
+  // TODO: Dart 2.0 requires this method to be implemented.
+  void updateAll(V update(K key, V value)) {
+    throw new UnimplementedError('updateAll');
+  }
 }
 
 /// An unmodifiable [Set] view of the keys of a [Map].
@@ -416,6 +542,11 @@
 
   Iterable<E> get _base => _baseMap.keys;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) => _baseMap.containsKey(element);
 
   bool get isEmpty => _baseMap.isEmpty;
@@ -452,6 +583,11 @@
   E lookup(Object element) =>
       throw new UnsupportedError("MapKeySet doesn't support lookup().");
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   /// Returns a new set which contains all the elements of [this] and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] and all
@@ -498,6 +634,11 @@
 
   Iterable<V> get _base => _baseMap.values;
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> cast<T>() {
+    throw new UnimplementedError('cast');
+  }
+
   bool contains(Object element) {
     if (element != null && element is! V) return false;
     var key = _keyForValue(element as V);
@@ -594,6 +735,11 @@
   void retainWhere(bool test(V element)) =>
       removeWhere((element) => !test(element));
 
+  // TODO: Dart 2.0 requires this method to be implemented.
+  Set<T> retype<T>() {
+    throw new UnimplementedError('retype');
+  }
+
   /// Returns a new set which contains all the elements of [this] and [other].
   ///
   /// That is, the returned set contains all the elements of this [Set] and all
diff --git a/pubspec.yaml b/pubspec.yaml
index 9bf346e..b8c47e3 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: collection
-version: 1.14.4-dev
+version: 1.14.4
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: https://www.github.com/dart-lang/collection
diff --git a/test/wrapper_test.dart b/test/wrapper_test.dart
index b19b49b..95e6f36 100644
--- a/test/wrapper_test.dart
+++ b/test/wrapper_test.dart
@@ -87,6 +87,9 @@
 class IterableNSM extends NSM implements Iterable, Set, List, Queue {
   IterableNSM(action(Invocation i)) : super(action);
   toString() => super.noSuchMethod(TO_STRING_INVOCATION) as String;
+
+  Null cast<T>();
+  Null retype<T>();
 }
 
 // Expector that wraps in DelegatingIterable.
