diff --git a/pkgs/watcher/CHANGELOG.md b/pkgs/watcher/CHANGELOG.md
index 8f1ffc3..fe30bc6 100644
--- a/pkgs/watcher/CHANGELOG.md
+++ b/pkgs/watcher/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.9.7+8
+
+* Fix Dart 2.0 type issues on Mac and Windows.
+
 # 0.9.7+7
 
 * Updates to support Dart 2.0 core library changes (wave 2.2). 
diff --git a/pkgs/watcher/lib/src/directory_watcher/mac_os.dart b/pkgs/watcher/lib/src/directory_watcher/mac_os.dart
index 759765f..5ad9984 100644
--- a/pkgs/watcher/lib/src/directory_watcher/mac_os.dart
+++ b/pkgs/watcher/lib/src/directory_watcher/mac_os.dart
@@ -171,7 +171,7 @@
   /// The returned events won't contain any [FileSystemMoveEvent]s, nor will it
   /// contain any events relating to [path].
   Map<String, Set<FileSystemEvent>> _sortEvents(List<FileSystemEvent> batch) {
-    var eventsForPaths = <String, Set>{};
+    var eventsForPaths = <String, Set<FileSystemEvent>>{};
 
     // FSEvents can report past events, including events on the root directory
     // such as it being created. We want to ignore these. If the directory is
@@ -182,20 +182,21 @@
     // directory's full contents will be examined anyway, so we ignore such
     // events. Emitting them could cause useless or out-of-order events.
     var directories = unionAll(batch.map((event) {
-      if (!event.isDirectory) return new Set();
+      if (!event.isDirectory) return new Set<String>();
       if (event is FileSystemMoveEvent) {
-        return new Set.from([event.path, event.destination]);
+        return new Set<String>.from([event.path, event.destination]);
       }
-      return new Set.from([event.path]);
+      return new Set<String>.from([event.path]);
     }));
 
-    isInModifiedDirectory(path) =>
+    isInModifiedDirectory(String path) =>
         directories.any((dir) => path != dir && path.startsWith(dir));
 
-    addEvent(path, event) {
+    addEvent(String path, FileSystemEvent event) {
       if (isInModifiedDirectory(path)) return;
-      var set = eventsForPaths.putIfAbsent(path, () => new Set());
-      set.add(event);
+      eventsForPaths
+          .putIfAbsent(path, () => new Set<FileSystemEvent>())
+          .add(event);
     }
 
     for (var event in batch) {
diff --git a/pkgs/watcher/lib/src/directory_watcher/windows.dart b/pkgs/watcher/lib/src/directory_watcher/windows.dart
index 3352b68..db9ca83 100644
--- a/pkgs/watcher/lib/src/directory_watcher/windows.dart
+++ b/pkgs/watcher/lib/src/directory_watcher/windows.dart
@@ -216,26 +216,27 @@
   /// The returned events won't contain any [FileSystemMoveEvent]s, nor will it
   /// contain any events relating to [path].
   Map<String, Set<FileSystemEvent>> _sortEvents(List<FileSystemEvent> batch) {
-    var eventsForPaths = <String, Set>{};
+    var eventsForPaths = <String, Set<FileSystemEvent>>{};
 
     // Events within directories that already have events are superfluous; the
     // directory's full contents will be examined anyway, so we ignore such
     // events. Emitting them could cause useless or out-of-order events.
     var directories = unionAll(batch.map((event) {
-      if (!event.isDirectory) return new Set();
+      if (!event.isDirectory) return new Set<String>();
       if (event is FileSystemMoveEvent) {
-        return new Set.from([event.path, event.destination]);
+        return new Set<String>.from([event.path, event.destination]);
       }
-      return new Set.from([event.path]);
+      return new Set<String>.from([event.path]);
     }));
 
-    isInModifiedDirectory(path) =>
+    isInModifiedDirectory(String path) =>
         directories.any((dir) => path != dir && path.startsWith(dir));
 
-    addEvent(path, event) {
+    addEvent(String path, FileSystemEvent event) {
       if (isInModifiedDirectory(path)) return;
-      var set = eventsForPaths.putIfAbsent(path, () => new Set());
-      set.add(event);
+      eventsForPaths
+          .putIfAbsent(path, () => new Set<FileSystemEvent>())
+          .add(event);
     }
 
     for (var event in batch) {
diff --git a/pkgs/watcher/lib/src/utils.dart b/pkgs/watcher/lib/src/utils.dart
index 0b2f799..62d8e0f 100644
--- a/pkgs/watcher/lib/src/utils.dart
+++ b/pkgs/watcher/lib/src/utils.dart
@@ -19,8 +19,8 @@
 }
 
 /// Returns the union of all elements in each set in [sets].
-Set unionAll(Iterable<Set> sets) =>
-    sets.fold(new Set(), (union, set) => union.union(set));
+Set<T> unionAll<T>(Iterable<Set<T>> sets) =>
+    sets.fold(new Set<T>(), (union, set) => union.union(set));
 
 /// Returns a buffered stream that will emit the same values as the stream
 /// returned by [future] once [future] completes.
diff --git a/pkgs/watcher/pubspec.yaml b/pkgs/watcher/pubspec.yaml
index daea75b..3cb9643 100644
--- a/pkgs/watcher/pubspec.yaml
+++ b/pkgs/watcher/pubspec.yaml
@@ -1,5 +1,5 @@
 name: watcher
-version: 0.9.7+7
+version: 0.9.7+8
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/watcher
 description: >
