diff --git a/analysis_options.yaml b/analysis_options.yaml
index da09e33..c6d2ad9 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,5 +1,6 @@
 analyzer:
   strong-mode:
+    implicit-casts: false
     implicit-dynamic: false
   errors:
     # treat missing required parameters as a warning (not a hint)
@@ -8,10 +9,6 @@
     missing_return: warning
     # allow having TODOs in the code
     todo: ignore
-    # Ignore analyzer hints for updating pubspecs when using Future or
-    # Stream and not importing dart:async
-    # Please see https://github.com/flutter/flutter/pull/24528 for details.
-    sdk_version_async_exported_from_core: ignore
 
 linter:
   rules:
diff --git a/packages/file/CHANGELOG.md b/packages/file/CHANGELOG.md
index 22c292c..61d3529 100644
--- a/packages/file/CHANGELOG.md
+++ b/packages/file/CHANGELOG.md
@@ -6,6 +6,8 @@
 * Fixed more test flakiness.
 * Enabled more tests.
 * Internal cleanup.
+* Remove implicit dynamic in preparation for null safety.
+* Remove dependency on Intl
 
 #### 5.2.1
 
diff --git a/packages/file/lib/src/backends/chroot/chroot_directory.dart b/packages/file/lib/src/backends/chroot/chroot_directory.dart
index e2daa90..8fec7b1 100644
--- a/packages/file/lib/src/backends/chroot/chroot_directory.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_directory.dart
@@ -137,7 +137,7 @@
     bool recursive = false,
     bool followLinks = true,
   }) {
-    Directory delegate = this.delegate;
+    Directory delegate = this.delegate as Directory;
     String dirname = delegate.path;
     return delegate
         .list(recursive: recursive, followLinks: followLinks)
@@ -149,7 +149,7 @@
     bool recursive = false,
     bool followLinks = true,
   }) {
-    Directory delegate = this.delegate;
+    Directory delegate = this.delegate as Directory;
     String dirname = delegate.path;
     return delegate
         .listSync(recursive: recursive, followLinks: followLinks)
diff --git a/packages/file/lib/src/backends/chroot/chroot_file.dart b/packages/file/lib/src/backends/chroot/chroot_file.dart
index 9d6c5ef..60bda56 100644
--- a/packages/file/lib/src/backends/chroot/chroot_file.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_file.dart
@@ -252,7 +252,7 @@
 
   @override
   Stream<Uint8List> openRead([int start, int end]) =>
-      getDelegate(followLinks: true).openRead(start, end);
+      getDelegate(followLinks: true).openRead(start, end).cast<Uint8List>();
 
   @override
   IOSink openWrite({
diff --git a/packages/file/lib/src/backends/chroot/chroot_file_system.dart b/packages/file/lib/src/backends/chroot/chroot_file_system.dart
index 0baec9b..5e383bd 100644
--- a/packages/file/lib/src/backends/chroot/chroot_file_system.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_file_system.dart
@@ -112,9 +112,9 @@
       case FileSystemEntityType.directory:
         break;
       case FileSystemEntityType.notFound:
-        throw common.noSuchFileOrDirectory(path);
+        throw common.noSuchFileOrDirectory(path as String);
       default:
-        throw common.notADirectory(path);
+        throw common.notADirectory(path as String);
     }
     assert(() {
       p.Context ctx = delegate.path;
diff --git a/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart b/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
index f16e67f..8e859ac 100644
--- a/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
+++ b/packages/file/lib/src/backends/chroot/chroot_file_system_entity.dart
@@ -52,7 +52,8 @@
 
   @override
   Directory wrapDirectory(io.Directory delegate) =>
-      _ChrootDirectory.wrapped(fileSystem, delegate, relative: !isAbsolute);
+      _ChrootDirectory.wrapped(fileSystem, delegate as Directory,
+          relative: !isAbsolute);
 
   @override
   File wrapFile(io.File delegate) =>
diff --git a/packages/file/lib/src/backends/memory/common.dart b/packages/file/lib/src/backends/memory/common.dart
index 1c8b4fd..d9d8f5c 100644
--- a/packages/file/lib/src/backends/memory/common.dart
+++ b/packages/file/lib/src/backends/memory/common.dart
@@ -10,6 +10,6 @@
 /// Throws a `FileSystemException` if [object] is null.
 void checkExists(Object object, PathGenerator path) {
   if (object == null) {
-    throw common.noSuchFileOrDirectory(path());
+    throw common.noSuchFileOrDirectory(path() as String);
   }
 }
diff --git a/packages/file/lib/src/backends/memory/memory_directory.dart b/packages/file/lib/src/backends/memory/memory_directory.dart
index 4e2bbd3..688e0df 100644
--- a/packages/file/lib/src/backends/memory/memory_directory.dart
+++ b/packages/file/lib/src/backends/memory/memory_directory.dart
@@ -74,7 +74,7 @@
     String fullPath = fileSystem.path.join(path, prefix);
     String dirname = fileSystem.path.dirname(fullPath);
     String basename = fileSystem.path.basename(fullPath);
-    DirectoryNode node = fileSystem.findNode(dirname);
+    DirectoryNode node = fileSystem.findNode(dirname) as DirectoryNode;
     checkExists(node, () => dirname);
     utils.checkIsDir(node, () => dirname);
     int _tempCounter = _systemTempCounter[fileSystem] ?? 0;
@@ -99,14 +99,14 @@
             throw common.directoryNotEmpty(newPath);
           }
         },
-      );
+      ) as Directory;
 
   @override
   Directory get parent =>
       (backingOrNull?.isRoot ?? false) ? this : super.parent;
 
   @override
-  Directory get absolute => super.absolute;
+  Directory get absolute => super.absolute as Directory;
 
   @override
   Stream<FileSystemEntity> list({
@@ -123,7 +123,7 @@
     bool recursive = false,
     bool followLinks = true,
   }) {
-    DirectoryNode node = backing;
+    DirectoryNode node = backing as DirectoryNode;
     List<FileSystemEntity> listing = <FileSystemEntity>[];
     List<_PendingListTask> tasks = <_PendingListTask>[
       _PendingListTask(
@@ -139,7 +139,9 @@
       task.dir.children.forEach((String name, Node child) {
         Set<LinkNode> breadcrumbs = Set<LinkNode>.from(task.breadcrumbs);
         String childPath = fileSystem.path.join(task.path, name);
-        while (followLinks && utils.isLink(child) && breadcrumbs.add(child)) {
+        while (followLinks &&
+            utils.isLink(child) &&
+            breadcrumbs.add(child as LinkNode)) {
           Node referent = (child as LinkNode).referentOrNull;
           if (referent != null) {
             child = referent;
@@ -148,7 +150,8 @@
         if (utils.isDirectory(child)) {
           listing.add(MemoryDirectory(fileSystem, childPath));
           if (recursive) {
-            tasks.add(_PendingListTask(child, childPath, breadcrumbs));
+            tasks.add(_PendingListTask(
+                child as DirectoryNode, childPath, breadcrumbs));
           }
         } else if (utils.isLink(child)) {
           listing.add(MemoryLink(fileSystem, childPath));
diff --git a/packages/file/lib/src/backends/memory/memory_file.dart b/packages/file/lib/src/backends/memory/memory_file.dart
index bda9ae9..3d7b8b3 100644
--- a/packages/file/lib/src/backends/memory/memory_file.dart
+++ b/packages/file/lib/src/backends/memory/memory_file.dart
@@ -29,10 +29,12 @@
     if (node == null) {
       node = _doCreate();
     } else {
-      node = utils.isLink(node) ? utils.resolveLinks(node, () => path) : node;
+      node = utils.isLink(node)
+          ? utils.resolveLinks(node as LinkNode, () => path)
+          : node;
       utils.checkType(expectedType, node.type, () => path);
     }
-    return node;
+    return node as FileNode;
   }
 
   @override
@@ -87,14 +89,14 @@
                 : common.isADirectory(path);
           }
         },
-      );
+      ) as File;
 
   @override
   Future<File> copy(String newPath) async => copySync(newPath);
 
   @override
   File copySync(String newPath) {
-    FileNode sourceNode = resolvedBacking;
+    FileNode sourceNode = resolvedBacking as FileNode;
     fileSystem.findNode(
       newPath,
       segmentVisitor: (
@@ -108,7 +110,8 @@
           if (child != null) {
             if (utils.isLink(child)) {
               List<String> ledger = <String>[];
-              child = utils.resolveLinks(child, () => newPath, ledger: ledger);
+              child = utils.resolveLinks(child as LinkNode, () => newPath,
+                  ledger: ledger);
               checkExists(child, () => newPath);
               parent = child.parent;
               childName = ledger.last;
@@ -134,7 +137,7 @@
   int lengthSync() => (resolvedBacking as FileNode).size;
 
   @override
-  File get absolute => super.absolute;
+  File get absolute => super.absolute as File;
 
   @override
   Future<DateTime> lastAccessed() async => lastAccessedSync();
@@ -148,7 +151,7 @@
 
   @override
   void setLastAccessedSync(DateTime time) {
-    FileNode node = resolvedBacking;
+    FileNode node = resolvedBacking as FileNode;
     node.accessed = time.millisecondsSinceEpoch;
   }
 
@@ -164,7 +167,7 @@
 
   @override
   void setLastModifiedSync(DateTime time) {
-    FileNode node = resolvedBacking;
+    FileNode node = resolvedBacking as FileNode;
     node.modified = time.millisecondsSinceEpoch;
   }
 
@@ -187,7 +190,7 @@
   @override
   Stream<Uint8List> openRead([int start, int end]) {
     try {
-      FileNode node = resolvedBacking;
+      FileNode node = resolvedBacking as FileNode;
       Uint8List content = node.content;
       if (start != null) {
         content = end == null
diff --git a/packages/file/lib/src/backends/memory/memory_file_system.dart b/packages/file/lib/src/backends/memory/memory_file_system.dart
index 38f818e..0451326 100644
--- a/packages/file/lib/src/backends/memory/memory_file_system.dart
+++ b/packages/file/lib/src/backends/memory/memory_file_system.dart
@@ -192,7 +192,7 @@
   /// Gets the node backing for the current working directory. Note that this
   /// can return null if the directory has been deleted or moved from under our
   /// feet.
-  DirectoryNode get _current => findNode(cwd);
+  DirectoryNode get _current => findNode(cwd) as DirectoryNode;
 
   @override
   Node findNode(
@@ -248,10 +248,11 @@
           if (segmentVisitor != null) {
             child = segmentVisitor(directory, basename, child, i, finalSegment);
           }
-          child = utils.resolveLinks(child, subpath, ledger: pathWithSymlinks);
+          child = utils.resolveLinks(child as LinkNode, subpath,
+              ledger: pathWithSymlinks);
         } else {
           child = utils.resolveLinks(
-            child,
+            child as LinkNode,
             subpath,
             ledger: pathWithSymlinks,
             tailVisitor: (DirectoryNode parent, String childName, Node child) {
@@ -266,7 +267,7 @@
       if (i < finalSegment) {
         checkExists(child, subpath);
         utils.checkIsDir(child, subpath);
-        directory = child;
+        directory = child as DirectoryNode;
       }
     }
     return child;
diff --git a/packages/file/lib/src/backends/memory/memory_file_system_entity.dart b/packages/file/lib/src/backends/memory/memory_file_system_entity.dart
index 32a7e2c..3ff5ba9 100644
--- a/packages/file/lib/src/backends/memory/memory_file_system_entity.dart
+++ b/packages/file/lib/src/backends/memory/memory_file_system_entity.dart
@@ -73,7 +73,9 @@
   @protected
   Node get resolvedBacking {
     Node node = backing;
-    node = utils.isLink(node) ? utils.resolveLinks(node, () => path) : node;
+    node = utils.isLink(node)
+        ? utils.resolveLinks(node as LinkNode, () => path)
+        : node;
     utils.checkType(expectedType, node.type, () => path);
     return node;
   }
@@ -262,7 +264,7 @@
               utils.checkType(expectedType, child.type, () => newPath);
             }
             if (validateOverwriteExistingEntity != null) {
-              validateOverwriteExistingEntity(child);
+              validateOverwriteExistingEntity(child as T);
             }
             parent.children.remove(childName);
           }
diff --git a/packages/file/lib/src/backends/memory/memory_link.dart b/packages/file/lib/src/backends/memory/memory_link.dart
index f7c7fd2..b22e2fd 100644
--- a/packages/file/lib/src/backends/memory/memory_link.dart
+++ b/packages/file/lib/src/backends/memory/memory_link.dart
@@ -38,7 +38,7 @@
                 : common.invalidArgument(newPath);
           }
         },
-      );
+      ) as Link;
 
   @override
   Future<Link> create(String target, {bool recursive = false}) async {
@@ -99,7 +99,7 @@
   }
 
   @override
-  Link get absolute => super.absolute;
+  Link get absolute => super.absolute as Link;
 
   @override
   @protected
diff --git a/packages/file/lib/src/backends/memory/utils.dart b/packages/file/lib/src/backends/memory/utils.dart
index a3d7786..de1b6ae 100644
--- a/packages/file/lib/src/backends/memory/utils.dart
+++ b/packages/file/lib/src/backends/memory/utils.dart
@@ -25,7 +25,7 @@
 /// Throws a [io.FileSystemException] if [node] is not a directory.
 void checkIsDir(Node node, PathGenerator path) {
   if (!isDirectory(node)) {
-    throw common.notADirectory(path());
+    throw common.notADirectory(path() as String);
   }
 }
 
@@ -39,12 +39,12 @@
   if (expectedType != actualType) {
     switch (expectedType) {
       case FileSystemEntityType.directory:
-        throw common.notADirectory(path());
+        throw common.notADirectory(path() as String);
       case FileSystemEntityType.file:
         assert(actualType == FileSystemEntityType.directory);
-        throw common.isADirectory(path());
+        throw common.isADirectory(path() as String);
       case FileSystemEntityType.link:
-        throw common.invalidArgument(path());
+        throw common.invalidArgument(path() as String);
       default:
         // Should not happen
         throw AssertionError();
@@ -89,9 +89,9 @@
 
   Node node = link;
   while (isLink(node)) {
-    link = node;
-    if (!breadcrumbs.add(node)) {
-      throw common.tooManyLevelsOfSymbolicLinks(path());
+    link = node as LinkNode;
+    if (!breadcrumbs.add(link)) {
+      throw common.tooManyLevelsOfSymbolicLinks(path() as String);
     }
     if (ledger != null) {
       if (link.fs.path.isAbsolute(link.target)) {
diff --git a/packages/file/lib/src/backends/record_replay/codecs.dart b/packages/file/lib/src/backends/record_replay/codecs.dart
index 1febe07..01f4abe 100644
--- a/packages/file/lib/src/backends/record_replay/codecs.dart
+++ b/packages/file/lib/src/backends/record_replay/codecs.dart
@@ -147,7 +147,7 @@
     _GenericEncoder generic = const _GenericEncoder();
     Map<String, dynamic> encoded = <String, dynamic>{};
     for (dynamic key in input.keys) {
-      String encodedKey = generic.convert(key);
+      String encodedKey = generic.convert(key) as String;
       encoded[encodedKey] = generic.convert(input[key]);
     }
     return encoded;
@@ -212,11 +212,11 @@
 }
 
 /// A [PathContextCodec] serializes and deserializes [path.Context] instances.
-class PathContextCodec extends Codec<path.Context, Map<String, String>> {
+class PathContextCodec extends Codec<path.Context, Map<String, dynamic>> {
   /// Creates a new [PathContextCodec].
   const PathContextCodec();
 
-  static Map<String, String> _encode(path.Context input) {
+  static Map<String, dynamic> _encode(path.Context input) {
     return <String, String>{
       'style': input.style.name,
       'cwd': input.current,
@@ -230,23 +230,23 @@
         'windows': path.Style.windows,
         'url': path.Style.url,
       }[input['style']],
-      current: input['cwd'],
+      current: input['cwd'] as String,
     );
   }
 
   /// Converter that serializes [path.Context] instances.
-  static const Converter<path.Context, Map<String, String>> serialize =
-      _ForwardingConverter<path.Context, Map<String, String>>(_encode);
+  static const Converter<path.Context, Map<String, dynamic>> serialize =
+      _ForwardingConverter<path.Context, Map<String, dynamic>>(_encode);
 
   /// Converter that deserializes [path.Context] instances.
   static const Converter<Map<String, dynamic>, path.Context> deserialize =
       _ForwardingConverter<Map<String, dynamic>, path.Context>(_decode);
 
   @override
-  Converter<path.Context, Map<String, String>> get encoder => serialize;
+  Converter<path.Context, Map<String, dynamic>> get encoder => serialize;
 
   @override
-  Converter<Map<String, String>, path.Context> get decoder => deserialize;
+  Converter<Map<String, dynamic>, path.Context> get decoder => deserialize;
 }
 
 class _ResultEncoder extends Converter<ResultReference<dynamic>, Object> {
@@ -429,13 +429,13 @@
   final Map<String, Object> _data;
 
   @override
-  int get type => _data['type'];
+  int get type => _data['type'] as int;
 
   @override
-  String get path => _data['path'];
+  String get path => _data['path'] as String;
 
   @override
-  bool get isDirectory => _data['isDirectory'];
+  bool get isDirectory => _data['isDirectory'] as bool;
 }
 
 /// Converts an object into a [Future] that completes with that object.
@@ -617,7 +617,7 @@
   @override
   dynamic convert(dynamic input) {
     if (input is Map) {
-      String errorType = input[kManifestErrorTypeKey];
+      String errorType = input[kManifestErrorTypeKey] as String;
       if (_decoders.containsKey(errorType)) {
         return _decoders[errorType].convert(input);
       }
@@ -644,9 +644,9 @@
   static FileSystemException _decode(Map<String, Object> input) {
     Object osError = input['osError'];
     return FileSystemException(
-      input['message'],
-      input['path'],
-      osError == null ? null : const ToError().convert(osError),
+      input['message'] as String,
+      input['path'] as String,
+      osError == null ? null : const ToError().convert(osError) as OSError,
     );
   }
 
@@ -678,7 +678,7 @@
   }
 
   static OSError _decode(Map<String, Object> input) {
-    return OSError(input['message'], input['errorCode']);
+    return OSError(input['message'] as String, input['errorCode'] as int);
   }
 
   static const Converter<OSError, Map<String, Object>> serialize =
@@ -711,7 +711,7 @@
   static ArgumentError _decode(Map<String, Object> input) {
     dynamic message = input['message'];
     dynamic invalidValue = input['invalidValue'];
-    String name = input['name'];
+    String name = input['name'] as String;
     if (invalidValue != null) {
       return ArgumentError.value(invalidValue, name, message);
     } else if (name != null) {
@@ -748,7 +748,7 @@
   }
 
   static NoSuchMethodError _decode(Map<String, Object> input) {
-    return _NoSuchMethodError(input['toString']);
+    return _NoSuchMethodError(input['toString'] as String);
   }
 
   static const Converter<NoSuchMethodError, Map<String, Object>> serialize =
diff --git a/packages/file/lib/src/backends/record_replay/common.dart b/packages/file/lib/src/backends/record_replay/common.dart
index be610bf..8fb680c 100644
--- a/packages/file/lib/src/backends/record_replay/common.dart
+++ b/packages/file/lib/src/backends/record_replay/common.dart
@@ -135,9 +135,10 @@
   if (object1.runtimeType != object2.runtimeType) {
     return false;
   } else if (object1 is List) {
-    return _areListsEqual<dynamic>(object1, object2);
+    return _areListsEqual<dynamic>(object1, object2 as List<dynamic>);
   } else if (object1 is Map) {
-    return _areMapsEqual<dynamic, dynamic>(object1, object2);
+    return _areMapsEqual<dynamic, dynamic>(
+        object1, object2 as Map<dynamic, dynamic>);
   } else {
     return object1 == object2;
   }
diff --git a/packages/file/lib/src/backends/record_replay/events.dart b/packages/file/lib/src/backends/record_replay/events.dart
index 2a545a6..01e5ff4 100644
--- a/packages/file/lib/src/backends/record_replay/events.dart
+++ b/packages/file/lib/src/backends/record_replay/events.dart
@@ -88,10 +88,10 @@
   T get result {
     dynamic result = _result;
     while (result is ResultReference) {
-      ResultReference<dynamic> reference = result;
+      ResultReference<dynamic> reference = result as ResultReference<dynamic>;
       result = reference.recordedValue;
     }
-    return result;
+    return result as T;
   }
 
   @override
@@ -115,7 +115,7 @@
   Future<void> get done async {
     dynamic result = _result;
     while (result is ResultReference) {
-      ResultReference<dynamic> reference = result;
+      ResultReference<dynamic> reference = result as ResultReference<dynamic>;
       await reference.complete;
       result = reference.recordedValue;
     }
diff --git a/packages/file/lib/src/backends/record_replay/mutable_recording.dart b/packages/file/lib/src/backends/record_replay/mutable_recording.dart
index b6c41f6..ec30905 100644
--- a/packages/file/lib/src/backends/record_replay/mutable_recording.dart
+++ b/packages/file/lib/src/backends/record_replay/mutable_recording.dart
@@ -6,7 +6,6 @@
 import 'dart:convert';
 
 import 'package:file/file.dart';
-import 'package:intl/intl.dart';
 
 import 'codecs.dart';
 import 'common.dart';
@@ -64,7 +63,7 @@
   /// It is up to the caller to create the file - it will not exist in the
   /// file system when it is returned from this method.
   File newFile(String name) {
-    String basename = '${NumberFormat('000').format(newUid())}.$name';
+    String basename = '${newUid()}.$name';
     String dirname = destination.path;
     String path = destination.fileSystem.path.join(dirname, basename);
     return destination.fileSystem.file(path);
diff --git a/packages/file/lib/src/backends/record_replay/recording_directory.dart b/packages/file/lib/src/backends/record_replay/recording_directory.dart
index 4fa15c0..e157327 100644
--- a/packages/file/lib/src/backends/record_replay/recording_directory.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_directory.dart
@@ -16,7 +16,7 @@
     implements Directory {
   /// Creates a new `RecordingDirectory`.
   RecordingDirectory(RecordingFileSystem fileSystem, io.Directory delegate)
-      : super(fileSystem, delegate) {
+      : super(fileSystem as RecordingFileSystemImpl, delegate as Directory) {
     methods.addAll(<Symbol, Function>{
       #create: _create,
       #createSync: delegate.createSync,
diff --git a/packages/file/lib/src/backends/record_replay/recording_file.dart b/packages/file/lib/src/backends/record_replay/recording_file.dart
index 3114f1e..cc9b03e 100644
--- a/packages/file/lib/src/backends/record_replay/recording_file.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_file.dart
@@ -36,7 +36,7 @@
 class RecordingFile extends RecordingFileSystemEntity<File> implements File {
   /// Creates a new `RecordingFile`.
   RecordingFile(RecordingFileSystem fileSystem, io.File delegate)
-      : super(fileSystem, delegate) {
+      : super(fileSystem as RecordingFileSystemImpl, delegate as File) {
     methods.addAll(<Symbol, Function>{
       #create: _create,
       #createSync: delegate.createSync,
@@ -93,7 +93,7 @@
   StreamReference<Uint8List> _openRead([int start, int end]) {
     return _BlobStreamReference<Uint8List>(
       file: _newRecordingFile(),
-      stream: delegate.openRead(start, end),
+      stream: delegate.openRead(start, end).cast<Uint8List>(),
       writer: (File file, Uint8List bytes) {
         file.writeAsBytesSync(bytes, mode: FileMode.append, flush: true);
       },
diff --git a/packages/file/lib/src/backends/record_replay/recording_io_sink.dart b/packages/file/lib/src/backends/record_replay/recording_io_sink.dart
index 28ab6f8..1925018 100644
--- a/packages/file/lib/src/backends/record_replay/recording_io_sink.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_io_sink.dart
@@ -50,7 +50,7 @@
   String get identifier => '$runtimeType@$uid';
 
   @override
-  MutableRecording get recording => fileSystem.recording;
+  MutableRecording get recording => fileSystem.recording as MutableRecording;
 
   @override
   Stopwatch get stopwatch => fileSystem.stopwatch;
diff --git a/packages/file/lib/src/backends/record_replay/recording_link.dart b/packages/file/lib/src/backends/record_replay/recording_link.dart
index 14eac4d..01954b9 100644
--- a/packages/file/lib/src/backends/record_replay/recording_link.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_link.dart
@@ -15,7 +15,7 @@
 class RecordingLink extends RecordingFileSystemEntity<Link> implements Link {
   /// Creates a new `RecordingLink`.
   RecordingLink(RecordingFileSystem fileSystem, io.Link delegate)
-      : super(fileSystem, delegate) {
+      : super(fileSystem as RecordingFileSystemImpl, delegate as Link) {
     methods.addAll(<Symbol, Function>{
       #create: _create,
       #createSync: delegate.createSync,
diff --git a/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart b/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
index e5bb186..08f92da 100644
--- a/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_proxy_mixin.dart
@@ -90,12 +90,6 @@
   @protected
   Stopwatch get stopwatch;
 
-  // This check is used in noSuchMethod to detect if this code is running in a
-  // Dart 1 runtime, or Dart 2.
-  // TODO(srawlins): Remove this after the minimum SDK constraint is such that
-  // there is no "Dart 1" runtime mode. 2.0.0 or something.
-  bool get _runningDart1Runtime => <dynamic>[] is List<String>;
-
   /// Handles invocations for which there is no concrete implementation
   /// function.
   ///
@@ -137,7 +131,7 @@
     try {
       value = Function.apply(method, args, namedArgs);
     } catch (error) {
-      recording.add(createEvent(error: error));
+      recording.add(createEvent(error: error) as LiveInvocationEvent<dynamic>);
       rethrow;
     }
 
@@ -146,45 +140,43 @@
     // We have to instantiate the correct type of StreamReference or
     // FutureReference, so that types are not lost when we unwrap the references
     // afterward.
-    if (_runningDart1Runtime && value is Stream<dynamic>) {
-      // This one is here for Dart 1 runtime mode.
-      value = StreamReference<dynamic>(value);
-    } else if (value is Stream<FileSystemEntity>) {
-      value = StreamReference<FileSystemEntity>(value);
+    if (value is Stream<FileSystemEntity>) {
+      value =
+          StreamReference<FileSystemEntity>(value as Stream<FileSystemEntity>);
     } else if (value is Stream<String>) {
-      value = StreamReference<String>(value);
+      value = StreamReference<String>(value as Stream<String>);
     } else if (value is Stream) {
       throw UnimplementedError(
           'Cannot record method with return type ${value.runtimeType}');
-    } else if (_runningDart1Runtime && value is Future<dynamic>) {
-      // This one is here for Dart 1 runtime mode.
-      value = FutureReference<dynamic>(value);
     } else if (value is Future<bool>) {
-      value = FutureReference<bool>(value);
+      value = FutureReference<bool>(value as Future<bool>);
     } else if (value is Future<Directory>) {
-      value = FutureReference<Directory>(value);
+      value = FutureReference<Directory>(value as Future<Directory>);
     } else if (value is Future<File>) {
-      value = FutureReference<File>(value);
+      value = FutureReference<File>(value as Future<File>);
     } else if (value is Future<FileNode>) {
-      value = FutureReference<FileNode>(value);
+      value = FutureReference<FileNode>(value as Future<FileNode>);
     } else if (value is Future<FileStat>) {
-      value = FutureReference<FileStat>(value);
+      value = FutureReference<FileStat>(value as Future<FileStat>);
     } else if (value is Future<Link>) {
-      value = FutureReference<Link>(value);
+      value = FutureReference<Link>(value as Future<Link>);
     } else if (value is Future<FileSystemEntity>) {
-      value = FutureReference<FileSystemEntity>(value);
+      value =
+          FutureReference<FileSystemEntity>(value as Future<FileSystemEntity>);
     } else if (value is Future<FileSystemEntityType>) {
-      value = FutureReference<FileSystemEntityType>(value);
+      value = FutureReference<FileSystemEntityType>(
+          value as Future<FileSystemEntityType>);
     } else if (value is Future<String>) {
-      value = FutureReference<String>(value);
+      value = FutureReference<String>(value as Future<String>);
     } else if (value is Future<RandomAccessFile>) {
-      value = FutureReference<RandomAccessFile>(value);
+      value =
+          FutureReference<RandomAccessFile>(value as Future<RandomAccessFile>);
     } else if (value is Future<void>) {
-      value = FutureReference<void>(value);
+      value = FutureReference<void>(value as Future<void>);
     }
 
     // Record the invocation event associated with this invocation.
-    recording.add(createEvent(result: value));
+    recording.add(createEvent(result: value) as LiveInvocationEvent<dynamic>);
 
     // Unwrap any result references before returning to the caller.
     dynamic result = value;
diff --git a/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart b/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
index f31c5a9..f5ba461 100644
--- a/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
+++ b/packages/file/lib/src/backends/record_replay/recording_random_access_file.dart
@@ -69,7 +69,7 @@
   String get identifier => '$runtimeType@$uid';
 
   @override
-  MutableRecording get recording => fileSystem.recording;
+  MutableRecording get recording => fileSystem.recording as MutableRecording;
 
   @override
   Stopwatch get stopwatch => fileSystem.stopwatch;
diff --git a/packages/file/lib/src/backends/record_replay/replay_file_stat.dart b/packages/file/lib/src/backends/record_replay/replay_file_stat.dart
index 58d36e5..497d403 100644
--- a/packages/file/lib/src/backends/record_replay/replay_file_stat.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_file_stat.dart
@@ -16,24 +16,27 @@
   final Map<String, dynamic> _data;
 
   @override
-  DateTime get changed => DateTimeCodec.deserialize.convert(_data['changed']);
+  DateTime get changed =>
+      DateTimeCodec.deserialize.convert(_data['changed'] as int);
 
   @override
-  DateTime get modified => DateTimeCodec.deserialize.convert(_data['modified']);
+  DateTime get modified =>
+      DateTimeCodec.deserialize.convert(_data['modified'] as int);
 
   @override
-  DateTime get accessed => DateTimeCodec.deserialize.convert(_data['accessed']);
+  DateTime get accessed =>
+      DateTimeCodec.deserialize.convert(_data['accessed'] as int);
 
   @override
   FileSystemEntityType get type =>
-      EntityTypeCodec.deserialize.convert(_data['type']);
+      EntityTypeCodec.deserialize.convert(_data['type'] as String);
 
   @override
-  int get mode => _data['mode'];
+  int get mode => _data['mode'] as int;
 
   @override
-  int get size => _data['size'];
+  int get size => _data['size'] as int;
 
   @override
-  String modeString() => _data['modeString'];
+  String modeString() => _data['modeString'] as String;
 }
diff --git a/packages/file/lib/src/backends/record_replay/replay_file_system.dart b/packages/file/lib/src/backends/record_replay/replay_file_system.dart
index 1560c99..35b12c4 100644
--- a/packages/file/lib/src/backends/record_replay/replay_file_system.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_file_system.dart
@@ -75,8 +75,8 @@
     if (!manifestFile.existsSync()) {
       throw ArgumentError('Not a valid recording directory: $dirname');
     }
-    List<Map<String, dynamic>> manifest = const JsonDecoder()
-        .convert(manifestFile.readAsStringSync())
+    List<Map<String, dynamic>> manifest = (const JsonDecoder()
+            .convert(manifestFile.readAsStringSync()) as List<dynamic>)
         .cast<Map<String, dynamic>>();
     return ReplayFileSystemImpl(recording, manifest);
   }
diff --git a/packages/file/lib/src/backends/record_replay/replay_io_sink.dart b/packages/file/lib/src/backends/record_replay/replay_io_sink.dart
index f222ae4..4dbbd4d 100644
--- a/packages/file/lib/src/backends/record_replay/replay_io_sink.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_io_sink.dart
@@ -46,8 +46,9 @@
   @override
   dynamic onResult(Invocation invocation, dynamic result) {
     if (invocation.memberName == #addStream) {
-      Stream<List<int>> stream = invocation.positionalArguments.first;
-      Future<dynamic> future = result;
+      Stream<List<int>> stream =
+          invocation.positionalArguments.first as Stream<List<int>>;
+      Future<dynamic> future = result as Future<dynamic>;
       return future.then<void>(stream.drain);
     }
     return result;
diff --git a/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart b/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
index 70bd44e..d501ab3 100644
--- a/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
+++ b/packages/file/lib/src/backends/record_replay/replay_proxy_mixin.dart
@@ -146,8 +146,10 @@
 
   _InvocationMatcher _getMatcher(Invocation invocation) {
     String name = getSymbolName(invocation.memberName);
-    List<dynamic> args = encode(invocation.positionalArguments);
-    Map<String, dynamic> namedArgs = encode(invocation.namedArguments);
+    List<dynamic> args =
+        encode(invocation.positionalArguments) as List<dynamic>;
+    Map<String, dynamic> namedArgs =
+        encode(invocation.namedArguments) as Map<String, dynamic>;
 
     if (invocation.isGetter) {
       return (Map<String, dynamic> entry) =>
@@ -165,7 +167,9 @@
         return entry[kManifestTypeKey] == kInvokeType &&
             entry[kManifestMethodKey] == name &&
             deeplyEqual(entry[kManifestPositionalArgumentsKey], args) &&
-            deeplyEqual(_asNamedArgsType(entry[kManifestNamedArgumentsKey]),
+            deeplyEqual(
+                _asNamedArgsType(
+                    entry[kManifestNamedArgumentsKey] as Map<String, dynamic>),
                 namedArgs) &&
             entry[kManifestObjectKey] == identifier;
       };
diff --git a/packages/file/lib/src/forwarding/forwarding_directory.dart b/packages/file/lib/src/forwarding/forwarding_directory.dart
index 235b1fd..062e02b 100644
--- a/packages/file/lib/src/forwarding/forwarding_directory.dart
+++ b/packages/file/lib/src/forwarding/forwarding_directory.dart
@@ -11,7 +11,7 @@
 abstract class ForwardingDirectory<T extends Directory>
     implements ForwardingFileSystemEntity<T, io.Directory>, Directory {
   @override
-  T wrap(io.Directory delegate) => wrapDirectory(delegate);
+  T wrap(io.Directory delegate) => wrapDirectory(delegate) as T;
 
   @override
   Future<Directory> create({bool recursive = false}) async =>
diff --git a/packages/file/lib/src/forwarding/forwarding_file.dart b/packages/file/lib/src/forwarding/forwarding_file.dart
index e0d52a0..8f98b50 100644
--- a/packages/file/lib/src/forwarding/forwarding_file.dart
+++ b/packages/file/lib/src/forwarding/forwarding_file.dart
@@ -13,7 +13,7 @@
 abstract class ForwardingFile
     implements ForwardingFileSystemEntity<File, io.File>, File {
   @override
-  ForwardingFile wrap(io.File delegate) => wrapFile(delegate);
+  ForwardingFile wrap(io.File delegate) => wrapFile(delegate) as ForwardingFile;
 
   @override
   Future<File> create({bool recursive = false}) async =>
diff --git a/packages/file/lib/src/forwarding/forwarding_link.dart b/packages/file/lib/src/forwarding/forwarding_link.dart
index 25a37d2..6dd0403 100644
--- a/packages/file/lib/src/forwarding/forwarding_link.dart
+++ b/packages/file/lib/src/forwarding/forwarding_link.dart
@@ -11,7 +11,7 @@
 abstract class ForwardingLink
     implements ForwardingFileSystemEntity<Link, io.Link>, Link {
   @override
-  ForwardingLink wrap(io.Link delegate) => wrapLink(delegate);
+  ForwardingLink wrap(io.Link delegate) => wrapLink(delegate) as ForwardingLink;
 
   @override
   Future<Link> create(String target, {bool recursive = false}) async =>
diff --git a/packages/file/pubspec.yaml b/packages/file/pubspec.yaml
index 6058e05..9b065eb 100644
--- a/packages/file/pubspec.yaml
+++ b/packages/file/pubspec.yaml
@@ -13,7 +13,6 @@
 homepage: https://github.com/google/file.dart
 
 dependencies:
-  intl: '>=0.14.0 <1.0.0'
   meta: ^1.1.2
   path: ^1.5.1
 
diff --git a/packages/file/test/chroot_test.dart b/packages/file/test/chroot_test.dart
index 997411c..4d811a0 100644
--- a/packages/file/test/chroot_test.dart
+++ b/packages/file/test/chroot_test.dart
@@ -67,7 +67,7 @@
 
       setUp(() {
         fs = createMemoryBackedChrootFileSystem();
-        mem = fs.delegate;
+        mem = fs.delegate as MemoryFileSystem;
       });
 
       group('FileSystem', () {
diff --git a/packages/file/test/common_tests.dart b/packages/file/test/common_tests.dart
index 702a441..bf10efc 100644
--- a/packages/file/test/common_tests.dart
+++ b/packages/file/test/common_tests.dart
@@ -144,7 +144,7 @@
 
     setUp(() async {
       root = rootfn != null ? rootfn() : '/';
-      fs = await createFs();
+      fs = await createFs() as FileSystem;
       assert(fs.path.isAbsolute(root));
       assert(!root.endsWith(fs.path.separator) ||
           fs.path.rootPrefix(root) == root);
diff --git a/packages/file/test/record_replay_matchers.dart b/packages/file/test/record_replay_matchers.dart
index 15932e6..6187242 100644
--- a/packages/file/test/record_replay_matchers.dart
+++ b/packages/file/test/record_replay_matchers.dart
@@ -72,7 +72,7 @@
   /// Returns this matcher for chaining.
   T on(dynamic object) {
     _fieldMatchers.add(_Target(object));
-    return this;
+    return this as T;
   }
 
   /// Limits the scope of the match to invocations that produced the specified
@@ -90,7 +90,7 @@
   /// Returns this matcher for chaining.
   T withResult(dynamic result) {
     _fieldMatchers.add(_Result(result));
-    return this;
+    return this as T;
   }
 
   /// Limits the scope of the match to invocations that were recorded with the
@@ -102,7 +102,7 @@
   /// Returns this matcher for chaining.
   T withTimestamp(dynamic timestamp) {
     _fieldMatchers.add(_Timestamp(timestamp));
-    return this;
+    return this as T;
   }
 
   /// @nodoc
@@ -129,8 +129,9 @@
     Map<dynamic, dynamic> matchState,
     bool verbose,
   ) {
-    Matcher matcher = matchState['matcher'];
-    matcher.describeMismatch(item, description, matchState['state'], verbose);
+    Matcher matcher = matchState['matcher'] as Matcher;
+    matcher.describeMismatch(item, description,
+        matchState['state'] as Map<String, dynamic>, verbose);
     return description;
   }
 
@@ -369,7 +370,7 @@
 
   @override
   bool matches(dynamic item, Map<dynamic, dynamic> matchState) =>
-      _matcher.matches(getSymbolName(item.method), matchState);
+      _matcher.matches(getSymbolName(item.method as Symbol), matchState);
 
   @override
   Description describeMismatch(
@@ -378,7 +379,7 @@
     Map<dynamic, dynamic> matchState,
     bool verbose,
   ) {
-    String methodName = getSymbolName(item.method);
+    String methodName = getSymbolName(item.method as Symbol);
     description.add('invoked method: \'$methodName\'');
     Description matcherDesc = StringDescription();
     _matcher.describeMismatch(methodName, matcherDesc, matchState, verbose);
@@ -482,7 +483,7 @@
 
   @override
   bool matches(dynamic item, Map<dynamic, dynamic> matchState) =>
-      _matcher.matches(getSymbolName(item.property), matchState);
+      _matcher.matches(getSymbolName(item.property as Symbol), matchState);
 
   @override
   Description describeMismatch(
@@ -491,7 +492,7 @@
     Map<dynamic, dynamic> matchState,
     bool verbose,
   ) {
-    String propertyName = getSymbolName(item.property);
+    String propertyName = getSymbolName(item.property as Symbol);
     description.add('got property: \'$propertyName\'');
     Description matcherDesc = StringDescription();
     _matcher.describeMismatch(propertyName, matcherDesc, matchState, verbose);
@@ -515,7 +516,7 @@
 
   /// Strips the trailing `=` off the symbol name to get the property name.
   String _getPropertyName(dynamic item) {
-    String symbolName = getSymbolName(item.property);
+    String symbolName = getSymbolName(item.property as Symbol);
     return symbolName.substring(0, symbolName.length - 1);
   }
 
diff --git a/packages/file/test/recording_test.dart b/packages/file/test/recording_test.dart
index ed61f18..968dad1 100644
--- a/packages/file/test/recording_test.dart
+++ b/packages/file/test/recording_test.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:file/file.dart';
 import 'package:file/memory.dart';
@@ -197,7 +198,8 @@
         await rc.futureMethod('qux', namedArg: 'quz');
         await rc.streamMethod('quux', namedArg: 'quuz').drain<void>();
         List<Map<String, dynamic>> manifest =
-            await encode(recording.events).cast<Map<String, dynamic>>();
+            (await encode(recording.events) as List<dynamic>)
+                .cast<Map<String, dynamic>>();
         expect(manifest[0], <String, dynamic>{
           'type': 'set',
           'property': 'basicProperty=',
@@ -435,7 +437,7 @@
             List<InvocationEvent<dynamic>> events = recording.events;
             expect(events.length, greaterThanOrEqualTo(2));
             expect(events[0], invokesMethod().withResult(isDirectory));
-            Directory directory = events[0].result;
+            Directory directory = events[0].result as Directory;
             expect(
                 events,
                 contains(setsProperty('currentDirectory')
@@ -624,7 +626,8 @@
                 containsPair('namedArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -654,7 +657,8 @@
                 containsPair('namedArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -682,7 +686,8 @@
                 containsPair('namedArguments', isEmpty),
                 containsPair('result', matches(r'^![0-9]+.foo$')),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -717,7 +722,8 @@
                       containsPair('encoding', 'iso-8859-1'),
                     )),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -752,7 +758,8 @@
                       containsPair('encoding', 'iso-8859-1'),
                     )),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -783,7 +790,8 @@
                 containsPair(
                     'namedArguments', <String, String>{'encoding': 'utf-8'}),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -814,7 +822,8 @@
                 containsPair(
                     'namedArguments', <String, String>{'encoding': 'utf-8'}),
               ));
-          File file = _getRecordingFile(recording, manifest[1]['result']);
+          File file =
+              _getRecordingFile(recording, manifest[1]['result'] as String);
           expect(file, exists);
           expect(await file.readAsString(), content);
         });
@@ -836,9 +845,9 @@
 List<Map<String, dynamic>> _loadManifest(LiveRecording recording) {
   List<FileSystemEntity> files = recording.destination.listSync();
   File manifestFile = files.singleWhere(
-      (FileSystemEntity entity) => entity.basename == kManifestName);
-  return const JsonDecoder()
-      .convert(manifestFile.readAsStringSync())
+      (FileSystemEntity entity) => entity.basename == kManifestName) as File;
+  return (const JsonDecoder().convert(manifestFile.readAsStringSync())
+          as List<dynamic>)
       .cast<Map<String, dynamic>>();
 }
 
