diff --git a/CHANGELOG.md b/CHANGELOG.md
index c52d585..6d371c9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,10 @@
 
 * Update `SpanFormatException` with `source` and `offset`.
 
+* All methods that take `Span`s, `Location`s, and `SourceFile`s as inputs now
+  also accept the corresponding `source_span` classes as well. Using the old
+  classes is now deprecated and will be unsupported in version 0.10.0.
+
 ## 0.9.3
 
 * Support writing SingleMapping objects to source map version 3 format.
diff --git a/lib/builder.dart b/lib/builder.dart
index cd30ccb..494a6b6 100644
--- a/lib/builder.dart
+++ b/lib/builder.dart
@@ -11,6 +11,7 @@
 
 import 'parser.dart';
 import 'span.dart';
+import 'src/span_wrapper.dart';
 
 /// Builds a source map given a set of mappings.
 class SourceMapBuilder {
@@ -18,8 +19,10 @@
   final List<Entry> _entries = <Entry>[];
 
   /// Adds an entry mapping the [targetOffset] to [source].
-  void addFromOffset(Location source,
-      SourceFile targetFile, int targetOffset, String identifier) {
+  ///
+  /// [source] can be either a [Location] or a [SourceLocation]. Using a
+  /// [Location] is deprecated and will be unsupported in version 0.10.0.
+  void addFromOffset(source, targetFile, int targetOffset, String identifier) {
     if (targetFile == null) {
       throw new ArgumentError('targetFile cannot be null');
     }
@@ -28,12 +31,27 @@
   }
 
   /// Adds an entry mapping [target] to [source].
-  void addSpan(Span source, Span target) {
-    var name = source.isIdentifier ? source.text : null;
+  ///
+  /// [source] and [target] can be either a [Span] or a [SourceSpan]. Using a
+  /// [Span] is deprecated and will be unsupported in version 0.10.0.
+  ///
+  /// If [isIdentifier] is true, this entry is considered to represent an
+  /// identifier whose value will be stored in the source map.
+  void addSpan(source, target, {bool isIdentifier}) {
+    source = SpanWrapper.wrap(source);
+    target = SpanWrapper.wrap(target);
+    if (isIdentifier == null) isIdentifier = source.isIdentifier;
+
+    var name = isIdentifier ? source.text : null;
     _entries.add(new Entry(source.start, target.start, name));
   }
 
-  void addLocation(Location source, Location target, String identifier) {
+  /// Adds an entry mapping [target] to [source].
+  ///
+  /// [source] and [target] can be either a [Location] or a [SourceLocation].
+  /// Using a [Location] is deprecated and will be unsupported in version
+  /// 0.10.0.
+  void addLocation(source, target, String identifier) {
     _entries.add(new Entry(source, target, identifier));
   }
 
@@ -57,7 +75,14 @@
   /// An identifier name, when this location is the start of an identifier.
   final String identifierName;
 
-  Entry(this.source, this.target, this.identifierName);
+  /// Creates a new [Entry] mapping [target] to [source].
+  ///
+  /// [source] and [target] can be either a [Location] or a [SourceLocation].
+  /// Using a [Location] is deprecated and will be unsupported in version
+  /// 0.10.0.
+  Entry(source, target, this.identifierName)
+      : source = LocationWrapper.wrap(source),
+        target = LocationWrapper.wrap(target);
 
   /// Implements [Comparable] to ensure that entries are ordered by their
   /// location in the target file. We sort primarily by the target offset
diff --git a/lib/parser.dart b/lib/parser.dart
index 3fd0d14..c18a1d6 100644
--- a/lib/parser.dart
+++ b/lib/parser.dart
@@ -10,6 +10,7 @@
 
 import 'builder.dart' as builder;
 import 'span.dart';
+import 'src/span_wrapper.dart';
 import 'src/utils.dart';
 import 'src/vlq.dart';
 
@@ -47,10 +48,21 @@
 
 /// A mapping parsed out of a source map.
 abstract class Mapping {
-  Span spanFor(int line, int column, {Map<String, SourceFile> files});
+  /// Returns the span associated with [line] and [column].
+  ///
+  /// The values of [files] can be either `source_map` [SourceFile]s or
+  /// `source_span` `SourceFile`s. Using `source_map` [SourceFile]s is
+  /// deprecated and will be unsupported in version 0.10.0.
+  Span spanFor(int line, int column, {Map<String, dynamic> files});
 
-  Span spanForLocation(Location loc, {Map<String, SourceFile> files}) {
-    return spanFor(loc.line, loc.column, files: files);
+  /// Returns the span associated with [location].
+  ///
+  /// The values of [files] may be either `source_map` [SourceFile]s or
+  /// `source_span` `SourceFile`s. Using `source_map` [SourceFile]s is
+  /// deprecated and will be unsupported in version 0.10.0.
+  Span spanForLocation(location, {Map<String, dynamic> files}) {
+    location = LocationWrapper.wrap(location);
+    return spanFor(location.line, location.column, files: files);
   }
 }
 
@@ -112,7 +124,7 @@
     return _lineStart.length - 1;
   }
 
-  Span spanFor(int line, int column, {Map<String, SourceFile> files}) {
+  Span spanFor(int line, int column, {Map<String, dynamic> files}) {
     int index = _indexFor(line, column);
     return _maps[index].spanFor(
         line - _lineStart[index], column - _columnStart[index], files: files);
@@ -351,7 +363,7 @@
     return (index <= 0) ? null : entries[index - 1];
   }
 
-  Span spanFor(int line, int column, {Map<String, SourceFile> files}) {
+  Span spanFor(int line, int column, {Map<String, dynamic> files}) {
     var entry = _findColumn(line, column, _findLine(line));
     if (entry == null || entry.sourceUrlId == null) return null;
     var url = urls[entry.sourceUrlId];
@@ -359,7 +371,7 @@
       url = '${sourceRoot}${url}';
     }
     if (files != null && files[url] != null) {
-      var file = files[url];
+      var file = SourceFileWrapper.wrap(files[url]);
       var start = file.getOffset(entry.sourceLine, entry.sourceColumn);
       if (entry.sourceNameId != null) {
         var text = names[entry.sourceNameId];
diff --git a/lib/printer.dart b/lib/printer.dart
index 0898017..aa18bd7 100644
--- a/lib/printer.dart
+++ b/lib/printer.dart
@@ -5,8 +5,11 @@
 /// Contains a code printer that generates code by recording the source maps.
 library source_maps.printer;
 
+import 'package:source_span/source_span.dart' as source_span;
+
 import 'builder.dart';
 import 'span.dart';
+import 'src/span_wrapper.dart';
 
 const int _LF = 10;
 const int _CR = 13;
@@ -75,9 +78,10 @@
   void mark(mark) {
     var loc;
     var identifier = null;
-    if (mark is Location) {
-      loc = mark;
-    } else if (mark is Span) {
+    if (mark is Location || mark is source_span.SourceLocation) {
+      loc = LocationWrapper.wrap(mark);
+    } else if (mark is Span || mark is source_span.SourceSpan) {
+      mark = SpanWrapper.wrap(mark);
       loc = mark.start;
       if (mark.isIdentifier) identifier = mark.text;
     }
@@ -124,15 +128,19 @@
   /// location of [object] in the original input. Only one, [location] or
   /// [span], should be provided at a time.
   ///
+  /// [location] can be either a [Location] or a [SourceLocation]. [span] can be
+  /// either a [Span] or a [SourceSpan]. Using a [Location] or a [Span] is
+  /// deprecated and will be unsupported in version 0.10.0.
+  ///
   /// Indicate [isOriginal] when [object] is copied directly from the user code.
   /// Setting [isOriginal] will make this printer propagate source map locations
   /// on every line-break.
-  void add(object, {Location location, Span span, bool isOriginal: false}) {
+  void add(object, {location, span, bool isOriginal: false}) {
     if (object is! String || location != null || span != null || isOriginal) {
       _flush();
       assert(location == null || span == null);
-      if (location != null) _items.add(location);
-      if (span != null) _items.add(span);
+      if (location != null) _items.add(LocationWrapper.wrap(location));
+      if (span != null) _items.add(SpanWrapper.wrap(span));
       if (isOriginal) _items.add(_ORIGINAL);
     }
 
@@ -156,12 +164,16 @@
   /// The [location] and [span] parameters indicate the corresponding source map
   /// location of [object] in the original input. Only one, [location] or
   /// [span], should be provided at a time.
-  void addLine(String line, {Location location, Span span}) {
+  ///
+  /// [location] can be either a [Location] or a [SourceLocation]. [span] can be
+  /// either a [Span] or a [SourceSpan]. Using a [Location] or a [Span] is
+  /// deprecated and will be unsupported in version 0.10.0.
+  void addLine(String line, {location, span}) {
     if (location != null || span != null) {
       _flush();
       assert(location == null || span == null);
-      if (location != null) _items.add(location);
-      if (span != null) _items.add(span);
+      if (location != null) _items.add(LocationWrapper.wrap(location));
+      if (span != null) _items.add(SpanWrapper.wrap(span));
     }
     if (line == null) return;
     if (line != '') {
diff --git a/lib/refactor.dart b/lib/refactor.dart
index 45fb069..47ce2ed 100644
--- a/lib/refactor.dart
+++ b/lib/refactor.dart
@@ -10,6 +10,7 @@
 
 import 'span.dart';
 import 'printer.dart';
+import 'src/span_wrapper.dart';
 
 /// Editable text transaction.
 ///
@@ -20,7 +21,13 @@
   final String original;
   final _edits = <_TextEdit>[];
 
-  TextEditTransaction(this.original, this.file);
+  /// Creates a new transaction.
+  ///
+  /// [file] can be either a `source_map` [SourceFile] or a `source_span`
+  /// `SourceFile`. Using a `source_map` [SourceFile] is deprecated and will be
+  /// unsupported in version 0.10.0.
+  TextEditTransaction(this.original, file)
+      : file = SourceFileWrapper.wrap(file);
 
   bool get hasEdits => _edits.length > 0;
 
diff --git a/lib/span.dart b/lib/span.dart
index b546a97..a21e893 100644
--- a/lib/span.dart
+++ b/lib/span.dart
@@ -12,6 +12,7 @@
 import 'src/utils.dart';
 
 /// A simple class that describe a segment of source text.
+@Deprecated("Use the source_span package instead.")
 abstract class Span implements Comparable {
   /// The start location of this span.
   final Location start;
@@ -79,6 +80,7 @@
 }
 
 /// A location in the source text
+@Deprecated("Use the source_span package instead.")
 abstract class Location implements Comparable {
   /// Url of the source containing this span.
   String get sourceUrl;
@@ -113,6 +115,7 @@
 }
 
 /// Implementation of [Location] with fixed values given at allocation time.
+@Deprecated("Use the source_span package instead.")
 class FixedLocation extends Location {
   final String sourceUrl;
   final int line;
@@ -123,6 +126,7 @@
 }
 
 /// Implementation of [Span] where all the values are given at allocation time.
+@Deprecated("Use the source_span package instead.")
 class FixedSpan extends Span {
   /// The source text for this span, if available.
   final String text;
@@ -137,6 +141,7 @@
 }
 
 /// [Location] with values computed from an underling [SourceFile].
+@Deprecated("Use the source_span package instead.")
 class FileLocation extends Location {
   /// The source file containing this location.
   final SourceFile file;
@@ -149,6 +154,7 @@
 }
 
 /// [Span] where values are computed from an underling [SourceFile].
+@Deprecated("Use the source_span package instead.")
 class FileSpan extends Span {
   /// The source file containing this span.
   final SourceFile file;
@@ -195,6 +201,7 @@
 /// Stores information about a source file, to permit computation of the line
 /// and column. Also contains a nice default error message highlighting the code
 /// location.
+@Deprecated("Use the source_span package instead.")
 class SourceFile {
   /// Url where the source file is located.
   final String url;
@@ -306,6 +313,7 @@
 /// allows you to set source-map locations based on the locations relative to
 /// the start of the segment, but that get translated to absolute locations in
 /// the original source file.
+@Deprecated("Use the source_span package instead.")
 class SourceFileSegment extends SourceFile {
   final int _baseOffset;
   final int _baseLine;
@@ -365,6 +373,7 @@
 }
 
 /// A class for exceptions that have source span information attached.
+@Deprecated("Use the source_span package instead.")
 class SpanException implements Exception {
   /// A message describing the exception.
   final String message;
@@ -384,6 +393,7 @@
 }
 
 /// A [SpanException] that's also a [FormatException].
+@Deprecated("Use the source_span package instead.")
 class SpanFormatException extends SpanException implements FormatException {
   final source;
 
diff --git a/lib/src/span_wrapper.dart b/lib/src/span_wrapper.dart
new file mode 100644
index 0000000..e0c107b
--- /dev/null
+++ b/lib/src/span_wrapper.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// 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.
+
+library source_maps.span_wrapper;
+
+import 'package:source_span/source_span.dart' as source_span;
+
+import '../span.dart';
+
+/// A wrapper that exposes a [source_span.SourceSpan] as a [Span].
+class SpanWrapper extends Span {
+  final source_span.SourceSpan _inner;
+
+  String get text => _inner.text;
+
+  SpanWrapper(source_span.SourceSpan inner, bool isIdentifier)
+      : _inner = inner,
+        super(
+            new LocationWrapper(inner.start),
+            new LocationWrapper(inner.end),
+            isIdentifier);
+
+  static Span wrap(span, [bool isIdentifier = false]) {
+    if (span is Span) return span;
+    return new SpanWrapper(span, isIdentifier);
+  }
+}
+
+/// A wrapper that exposes a [source_span.SourceLocation] as a [Location].
+class LocationWrapper extends Location {
+  final source_span.SourceLocation _inner;
+
+  String get sourceUrl => _inner.sourceUrl.toString();
+  int get line => _inner.line;
+  int get column => _inner.column;
+
+  LocationWrapper(source_span.SourceLocation inner)
+      : _inner = inner,
+        super(inner.offset);
+
+  static Location wrap(location) {
+    if (location is Location) return location;
+    return new LocationWrapper(location);
+  }
+}
+
+/// A wrapper that exposes a [source_span.SourceFile] as a [SourceFile].
+class SourceFileWrapper implements SourceFile {
+  final source_span.SourceFile _inner;
+
+  // These are necessary to avoid analyzer warnings;
+  final _lineStarts = null;
+  final _decodedChars = null;
+
+  String get url => _inner.url.toString();
+
+  SourceFileWrapper(this._inner);
+
+  static SourceFile wrap(sourceFile) {
+    if (sourceFile is SourceFile) return sourceFile;
+    return new SourceFileWrapper(sourceFile);
+  }
+
+  Span span(int start, [int end, bool isIdentifier = false]) {
+    if (end == null) end = start;
+    return new SpanWrapper(_inner.span(start, end), isIdentifier);
+  }
+
+  Location location(int offset) => new LocationWrapper(_inner.location(offset));
+
+  int getLine(int offset) => _inner.getLine(offset);
+
+  int getColumn(int line, int offset) => _inner.getColumn(offset, line: line);
+
+  int getOffset(int line, int column) => _inner.getOffset(line, column);
+
+  String getText(int start, [int end]) => _inner.getText(start, end);
+
+  String getLocationMessage(String message, int start, int end,
+      {bool useColors: false, String color}) {
+    return span(start, end).getLocationMessage(message,
+        useColors: useColors, color: color);
+  }
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index c5029e2..0548215 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -7,12 +7,13 @@
 #
 # When the minor version is upgraded, you *must* update that version constraint
 # in pub to stay in sync with this.
-version: 0.9.4
+version: 0.9.4-dev
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://www.dartlang.org
 dependencies:
   path: '>=1.2.0 <2.0.0'
+  source_span: '>=1.0.0 <2.0.0'
 environment:
   sdk: '>=0.8.10+6 <2.0.0'
 dev_dependencies:
