diff --git a/lib/src/change_notifier.dart b/lib/src/change_notifier.dart
index e07507f..40f5d4d 100644
--- a/lib/src/change_notifier.dart
+++ b/lib/src/change_notifier.dart
@@ -102,12 +102,10 @@
   @Deprecated('Exists to make migrations off Observable easier')
   @override
   @protected
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     throw new UnsupportedError('Not supported by ChangeNotifier');
   }
@@ -123,16 +121,14 @@
 ///     with ChangeNotifier<PropertyChangeRecord>, PropertyChangeMixin
 class PropertyChangeNotifier extends ChangeNotifier<PropertyChangeRecord> {
   @override
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     if (hasObservers && oldValue != newValue) {
       notifyChange(
-        new PropertyChangeRecord/*<T>*/(
+        new PropertyChangeRecord<T>(
           this,
           field,
           oldValue,
diff --git a/lib/src/collections/observable_list.dart b/lib/src/collections/observable_list.dart
index bd92555..6e48e86 100644
--- a/lib/src/collections/observable_list.dart
+++ b/lib/src/collections/observable_list.dart
@@ -39,10 +39,10 @@
   /// known usage is in `package:template_binding` - it will be upgraded before
   /// removing this method.
   @Deprecated('Use ListChangeRecord#apply instead')
-  static void applyChangeRecords/*<T>*/(
-    List/*<T>*/ previous,
-    List/*<T>*/ current,
-    List<ListChangeRecord/*<T>*/ > changes,
+  static void applyChangeRecords<T>(
+    List<T> previous,
+    List<T> current,
+    List<ListChangeRecord<T>> changes,
   ) {
     if (identical(previous, current)) {
       throw new ArgumentError("Can't use same list for previous and current");
@@ -58,11 +58,11 @@
   ///
   /// This was moved into `ListDiffer.diff`.
   @Deprecated('Use `ListDiffer.diff` instead')
-  static List<ListChangeRecord/*<T>*/ > calculateChangeRecords/*<T>*/(
-    List/*<T>*/ previous,
-    List/*<T>*/ current,
+  static List<ListChangeRecord<T>> calculateChangeRecords<T>(
+    List<T> previous,
+    List<T> current,
   ) {
-    return const ListDiffer/*<T>*/().diff(previous, current);
+    return const ListDiffer<T>().diff(previous, current);
   }
 
   /// Creates an observable list of the given [length].
@@ -186,16 +186,14 @@
   }
 
   @override
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     if (oldValue != newValue) {
       _propChanges.notifyChange(
-        new PropertyChangeRecord/*<T>*/(this, field, oldValue, newValue),
+        new PropertyChangeRecord<T>(this, field, oldValue, newValue),
       );
     }
     return newValue;
@@ -505,12 +503,10 @@
   }
 
   @override
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     throw new UnsupportedError('Not modifiable');
   }
diff --git a/lib/src/collections/observable_map.dart b/lib/src/collections/observable_map.dart
index f1c9191..3b9cc09 100644
--- a/lib/src/collections/observable_map.dart
+++ b/lib/src/collections/observable_map.dart
@@ -114,16 +114,14 @@
   }
 
   @override
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     if (oldValue != newValue) {
       _allChanges.notifyChange(
-        new PropertyChangeRecord/*<T>*/(this, field, oldValue, newValue),
+        new PropertyChangeRecord<T>(this, field, oldValue, newValue),
       );
     }
     return newValue;
@@ -221,12 +219,10 @@
   }
 
   @override
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     throw new UnsupportedError('Not modifiable');
   }
diff --git a/lib/src/collections/observable_set.dart b/lib/src/collections/observable_set.dart
index 79bd1d7..1117a29 100644
--- a/lib/src/collections/observable_set.dart
+++ b/lib/src/collections/observable_set.dart
@@ -200,12 +200,10 @@
   }
 
   @override
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     throw new UnsupportedError('Not modifiable');
   }
diff --git a/lib/src/differs/list_differ.dart b/lib/src/differs/list_differ.dart
index 58004a7..78abd75 100644
--- a/lib/src/differs/list_differ.dart
+++ b/lib/src/differs/list_differ.dart
@@ -18,7 +18,7 @@
 
   @override
   List<ListChangeRecord<E>> diff(List<E> e1, List<E> e2) {
-    return _calcSplices/*<E>*/(
+    return _calcSplices<E>(
       e2,
       _equality,
       0,
@@ -48,11 +48,11 @@
 // With 1-edit updates, the shortest path would be just to update all seven
 // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
 // leaves the substring '123' intact.
-List<List<int>> _calcEditDistance/*<E>*/(
-  List/*<E>*/ current,
+List<List<int>> _calcEditDistance<E>(
+  List<E> current,
   int currentStart,
   int currentEnd,
-  List/*<E>*/ old,
+  List<E> old,
   int oldStart,
   int oldEnd,
 ) {
@@ -134,10 +134,10 @@
   return edits.reversed;
 }
 
-int _sharedPrefix/*<E>*/(
-  Equality/*<E>*/ equality,
-  List/*<E>*/ e1,
-  List/*<E>*/ e2,
+int _sharedPrefix<E>(
+  Equality<E> equality,
+  List<E> e1,
+  List<E> e2,
   int searchLength,
 ) {
   for (var i = 0; i < searchLength; i++) {
@@ -148,10 +148,10 @@
   return searchLength;
 }
 
-int _sharedSuffix/*<E>*/(
-  Equality/*<E>*/ equality,
-  List/*<E>*/ e1,
-  List/*<E>*/ e2,
+int _sharedSuffix<E>(
+  Equality<E> equality,
+  List<E> e1,
+  List<E> e2,
   int searchLength,
 ) {
   var index1 = e1.length;
@@ -171,12 +171,12 @@
 // Complexity: O(l * p)
 //   l: The length of the current array
 //   p: The length of the old array
-List<ListChangeRecord/*<E>*/ > _calcSplices/*<E>*/(
-  List/*<E>*/ current,
-  Equality/*<E>*/ equality,
+List<ListChangeRecord<E>> _calcSplices<E>(
+  List<E> current,
+  Equality<E> equality,
   int currentStart,
   int currentEnd,
-  List/*<E>*/ old,
+  List<E> old,
   int oldStart,
   int oldEnd,
 ) {
@@ -212,7 +212,7 @@
   if (currentStart == currentEnd) {
     final spliceRemoved = old.sublist(oldStart, oldEnd);
     return [
-      new ListChangeRecord/*<E>*/ .remove(
+      new ListChangeRecord<E>.remove(
         current,
         currentStart,
         spliceRemoved,
@@ -221,7 +221,7 @@
   }
   if (oldStart == oldEnd) {
     return [
-      new ListChangeRecord/*<E>*/ .add(
+      new ListChangeRecord<E>.add(
         current,
         currentStart,
         currentEnd - currentStart,
@@ -241,17 +241,17 @@
   );
 
   var spliceIndex = -1;
-  var spliceRemovals = /*<E>*/ [];
+  var spliceRemovals = <E>[];
   var spliceAddedCount = 0;
 
   bool hasSplice() => spliceIndex != -1;
   void resetSplice() {
     spliceIndex = -1;
-    spliceRemovals = /*<E>*/ [];
+    spliceRemovals = <E>[];
     spliceAddedCount = 0;
   }
 
-  var splices = <ListChangeRecord/*<E>*/ >[];
+  var splices = <ListChangeRecord<E>>[];
 
   var index = currentStart;
   var oldIndex = oldStart;
@@ -259,7 +259,7 @@
     switch (op) {
       case _Edit.leave:
         if (hasSplice()) {
-          splices.add(new ListChangeRecord/*<E>*/(
+          splices.add(new ListChangeRecord<E>(
             current,
             spliceIndex,
             removed: spliceRemovals,
@@ -296,7 +296,7 @@
     }
   }
   if (hasSplice()) {
-    splices.add(new ListChangeRecord/*<E>*/(
+    splices.add(new ListChangeRecord<E>(
       current,
       spliceIndex,
       removed: spliceRemovals,
@@ -304,7 +304,7 @@
     ));
   }
   assert(() {
-    splices = new List<ListChangeRecord/*<E>*/ >.unmodifiable(splices);
+    splices = new List<ListChangeRecord<E>>.unmodifiable(splices);
     return true;
   });
   return splices;
@@ -314,9 +314,9 @@
   return math.min(end1, end2) - math.max(start1, start2);
 }
 
-void _mergeSplices/*<E>*/(
-  List<ListChangeRecord/*<E>*/ > splices,
-  ListChangeRecord/*<E>*/ record,
+void _mergeSplices<E>(
+  List<ListChangeRecord<E>> splices,
+  ListChangeRecord<E> record,
 ) {
   var spliceIndex = record.index;
   var spliceRemoved = record.removed;
@@ -331,7 +331,7 @@
   // - then continues and updates the subsequent splices with any offset diff.
   for (var i = 0; i < splices.length; i++) {
     var current = splices[i];
-    current = splices[i] = new ListChangeRecord/*<E>*/(
+    current = splices[i] = new ListChangeRecord<E>(
       current.object,
       current.index + insertionOffset,
       removed: current.removed,
@@ -386,7 +386,7 @@
       inserted = true;
       splices.insert(
         i,
-        new ListChangeRecord/*<E>*/(
+        new ListChangeRecord<E>(
           record.object,
           spliceIndex,
           removed: spliceRemoved,
@@ -395,7 +395,7 @@
       );
       i++;
       final offset = spliceAdded - spliceRemoved.length;
-      current = splices[i] = new ListChangeRecord/*<E>*/(
+      current = splices[i] = new ListChangeRecord<E>(
         current.object,
         current.index + offset,
         removed: current.removed,
@@ -405,7 +405,7 @@
     }
   }
   if (!inserted) {
-    splices.add(new ListChangeRecord/*<E>*/(
+    splices.add(new ListChangeRecord<E>(
       record.object,
       spliceIndex,
       removed: spliceRemoved,
@@ -414,11 +414,11 @@
   }
 }
 
-List<ListChangeRecord/*<E>*/ > _createInitialSplices/*<E>*/(
-  List/*<E>*/ list,
-  List<ListChangeRecord/*<E>*/ > records,
+List<ListChangeRecord<E>> _createInitialSplices<E>(
+  List<E> list,
+  List<ListChangeRecord<E>> records,
 ) {
-  final splices = <ListChangeRecord/*<E>*/ >[];
+  final splices = <ListChangeRecord<E>>[];
   for (var i = 0; i < records.length; i++) {
     _mergeSplices(splices, records[i]);
   }
@@ -439,13 +439,13 @@
 // Here, we inserted some records and then removed some of them.
 // If someone processed these records naively, they would "play back" the
 // insert incorrectly, because those items will be shifted.
-List<ListChangeRecord/*<E>*/ > projectListSplices/*<E>*/(
-  List/*<E>*/ list,
-  List<ListChangeRecord/*<E>*/ > records, [
-  Equality/*<E>*/ equality = const DefaultEquality/*<E>*/(),
+List<ListChangeRecord<E>> projectListSplices<E>(
+  List<E> list,
+  List<ListChangeRecord<E>> records, [
+  Equality<E> equality = const DefaultEquality(),
 ]) {
   if (records.length <= 1) return records;
-  final splices = <ListChangeRecord/*<E>*/ >[];
+  final splices = <ListChangeRecord<E>>[];
   final initialSplices = _createInitialSplices(list, records);
   for (final splice in initialSplices) {
     if (splice.addedCount == 1 && splice.removed.length == 1) {
diff --git a/lib/src/internal.dart b/lib/src/internal.dart
index d0ae2e1..780e317 100644
--- a/lib/src/internal.dart
+++ b/lib/src/internal.dart
@@ -2,10 +2,10 @@
 // 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.
 
-List/*<E>*/ freezeInDevMode/*<E>*/(List/*<E>*/ list) {
+List<E> freezeInDevMode<E>(List<E> list) {
   if (list == null) return const [];
   assert(() {
-    list = new List/*<E>*/ .unmodifiable(list);
+    list = new List<E>.unmodifiable(list);
     return true;
   });
   return list;
diff --git a/lib/src/observable.dart b/lib/src/observable.dart
index de9c637..1688202 100644
--- a/lib/src/observable.dart
+++ b/lib/src/observable.dart
@@ -71,12 +71,10 @@
   /// If you are using a typed `implements/extends Observable<C>`, it is illegal
   /// to call this method - will throw an [UnsupportedError] when called.
   @Deprecated('Use PropertyChangeNotifier')
-  /*=T*/ notifyPropertyChange/*<T>*/(
+  T notifyPropertyChange<T>(
     Symbol field,
-    /*=T*/
-    oldValue,
-    /*=T*/
-    newValue,
+    T oldValue,
+    T newValue,
   ) {
     if (hasObservers && oldValue != newValue && _supportsPropertyChanges) {
       notifyChange(
diff --git a/lib/src/records/list_change_record.dart b/lib/src/records/list_change_record.dart
index 59867b2..1fd81c7 100644
--- a/lib/src/records/list_change_record.dart
+++ b/lib/src/records/list_change_record.dart
@@ -41,7 +41,7 @@
 
   /// Records a `remove` operation at `object[index]` of [removed] elements.
   ListChangeRecord.remove(this.object, this.index, List<E> removed)
-      : this.removed = freezeInDevMode/*<E>*/(removed),
+      : this.removed = freezeInDevMode<E>(removed),
         this.addedCount = 0 {
     _assertValidState();
   }
@@ -51,7 +51,7 @@
   /// If [addedCount] is not specified it defaults to `removed.length`.
   ListChangeRecord.replace(this.object, this.index, List<E> removed,
       [int addedCount])
-      : this.removed = freezeInDevMode/*<E>*/(removed),
+      : this.removed = freezeInDevMode<E>(removed),
         this.addedCount = addedCount ?? removed.length {
     _assertValidState();
   }
