diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5c52e12..ddc6377 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,40 @@
 
 ### Core libraries
 
+* As part of (Issue [36900][]), the following methods and properties across
+  various core libraries, which used to declare a return type of `List<int>`,
+  were updated to declare a return type of `Uint8List`:
+
+  * `Utf8Codec.encode()` (and `Utf8Encoder.convert()`)
+  * `BytesBuilder.takeBytes()`
+  * `BytesBuilder.toBytes()`
+  * `File.readAsBytes()` (`Future<Uint8List>`)
+  * `File.readAsBytesSync()`
+  * `RandomAccessFile.read()` (`Future<Uint8List>`)
+  * `RandomAccessFile.readSync()`
+  * `InternetAddress.rawAddress`
+  * `RawSocket.read()`
+
+  In addition, the following typed lists were updated to have their `sublist()`
+  methods declare a return type that is the same as the source list:
+
+  * `Uint8List.sublist()` → `Uint8List`
+  * `Int8List.sublist()` → `Int8List`
+  * `Uint8ClampedList.sublist()` → `Uint8ClampedList`
+  * `Int16List.sublist()` → `Int16List`
+  * `Uint16List.sublist()` → `Uint16List`
+  * `Int32List.sublist()` → `Int32List`
+  * `Uint32List.sublist()` → `Uint32List`
+  * `Int64List.sublist()` → `Int64List`
+  * `Uint64List.sublist()` → `Uint64List`
+  * `Float32List.sublist()` → `Float32List`
+  * `Float64List.sublist()` → `Float64List`
+  * `Float32x4List.sublist()` → `Float32x4List`
+  * `Int32x4List.sublist()` → `Int32x4List`
+  * `Float64x2List.sublist()` → `Float64x2List`
+
+  [36900]: https://github.com/dart-lang/sdk/issues/36900
+
 #### `dart:core`
 
 * Update `Uri` class to support [RFC6874](https://tools.ietf.org/html/rfc6874):
diff --git a/DEPS b/DEPS
index 4d8c7e9..e7731b9 100644
--- a/DEPS
+++ b/DEPS
@@ -85,7 +85,7 @@
   "fixnum_tag": "0.10.9",
   "glob_tag": "1.1.7",
   "html_tag" : "0.14.0+1",
-  "http_io_rev": "57da05a66f5bf7df3dd7aebe7b7efe0dfc477baa",
+  "http_io_rev": "773f4bc73ef572e2c37e879b065c3b406d75e8fd",
   "http_multi_server_tag" : "2.0.5",
   "http_parser_tag" : "3.1.3",
   "http_retry_tag": "0.1.1",
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index 7c563c4..f79cf3e 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -111,12 +111,13 @@
       int startFromInBytes, int toCid, int fromCid) native "TypedData_setRange";
 }
 
-abstract class _IntListMixin implements List<int> {
+abstract class _IntListMixin<SpawnedType extends List<int>>
+    implements List<int> {
   int get elementSizeInBytes;
   int get offsetInBytes;
   _ByteBuffer get buffer;
 
-  List<int> _createList(int length);
+  SpawnedType _createList(int length);
 
   Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
@@ -441,10 +442,10 @@
     throw IterableElementError.tooMany();
   }
 
-  List<int> sublist(int start, [int end]) {
+  SpawnedType sublist(int start, [int end]) {
     end = RangeError.checkValidRange(start, end, this.length);
     var length = end - start;
-    List<int> result = _createList(length);
+    SpawnedType result = _createList(length);
     result.setRange(0, length, this, start);
     return result;
   }
@@ -462,12 +463,13 @@
   }
 }
 
-abstract class _DoubleListMixin implements List<double> {
+abstract class _DoubleListMixin<SpawnedType extends List<double>>
+    implements List<double> {
   int get elementSizeInBytes;
   int get offsetInBytes;
   _ByteBuffer get buffer;
 
-  List<double> _createList(int length);
+  SpawnedType _createList(int length);
 
   Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
@@ -795,10 +797,10 @@
     throw IterableElementError.tooMany();
   }
 
-  List<double> sublist(int start, [int end]) {
+  SpawnedType sublist(int start, [int end]) {
     end = RangeError.checkValidRange(start, end, this.length);
     var length = end - start;
-    List<double> result = _createList(length);
+    SpawnedType result = _createList(length);
     result.setRange(0, length, this, start);
     return result;
   }
@@ -821,7 +823,7 @@
   int get offsetInBytes;
   _ByteBuffer get buffer;
 
-  List<Float32x4> _createList(int length);
+  Float32x4List _createList(int length);
 
   Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
@@ -1153,10 +1155,10 @@
     throw IterableElementError.tooMany();
   }
 
-  List<Float32x4> sublist(int start, [int end]) {
+  Float32x4List sublist(int start, [int end]) {
     end = RangeError.checkValidRange(start, end, this.length);
     var length = end - start;
-    List<Float32x4> result = _createList(length);
+    Float32x4List result = _createList(length);
     result.setRange(0, length, this, start);
     return result;
   }
@@ -1179,7 +1181,7 @@
   int get offsetInBytes;
   _ByteBuffer get buffer;
 
-  List<Int32x4> _createList(int length);
+  Int32x4List _createList(int length);
 
   Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
@@ -1510,10 +1512,10 @@
     throw IterableElementError.tooMany();
   }
 
-  List<Int32x4> sublist(int start, [int end]) {
+  Int32x4List sublist(int start, [int end]) {
     end = RangeError.checkValidRange(start, end, this.length);
     var length = end - start;
-    List<Int32x4> result = _createList(length);
+    Int32x4List result = _createList(length);
     result.setRange(0, length, this, start);
     return result;
   }
@@ -1536,7 +1538,7 @@
   int get offsetInBytes;
   _ByteBuffer get buffer;
 
-  List<Float64x2> _createList(int length);
+  Float64x2List _createList(int length);
 
   Iterable<T> whereType<T>() => new WhereTypeIterable<T>(this);
 
@@ -1868,10 +1870,10 @@
     throw IterableElementError.tooMany();
   }
 
-  List<Float64x2> sublist(int start, [int end]) {
+  Float64x2List sublist(int start, [int end]) {
     end = RangeError.checkValidRange(start, end, this.length);
     var length = end - start;
-    List<Float64x2> result = _createList(length);
+    Float64x2List result = _createList(length);
     result.setRange(0, length, this, start);
     return result;
   }
@@ -2138,7 +2140,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Int8List extends _TypedList with _IntListMixin implements Int8List {
+class _Int8List extends _TypedList
+    with _IntListMixin<Int8List>
+    implements Int8List {
   factory _Int8List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2184,7 +2188,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Uint8List extends _TypedList with _IntListMixin implements Uint8List {
+class _Uint8List extends _TypedList
+    with _IntListMixin<Uint8List>
+    implements Uint8List {
   factory _Uint8List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2231,7 +2237,7 @@
 
 @pragma("vm:entry-point")
 class _Uint8ClampedList extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Uint8ClampedList>
     implements Uint8ClampedList {
   factory _Uint8ClampedList._uninstantiable() {
     throw "Unreachable";
@@ -2278,7 +2284,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Int16List extends _TypedList with _IntListMixin implements Int16List {
+class _Int16List extends _TypedList
+    with _IntListMixin<Int16List>
+    implements Int16List {
   factory _Int16List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2343,7 +2351,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Uint16List extends _TypedList with _IntListMixin implements Uint16List {
+class _Uint16List extends _TypedList
+    with _IntListMixin<Uint16List>
+    implements Uint16List {
   factory _Uint16List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2408,7 +2418,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Int32List extends _TypedList with _IntListMixin implements Int32List {
+class _Int32List extends _TypedList
+    with _IntListMixin<Int32List>
+    implements Int32List {
   factory _Int32List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2461,7 +2473,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Uint32List extends _TypedList with _IntListMixin implements Uint32List {
+class _Uint32List extends _TypedList
+    with _IntListMixin<Uint32List>
+    implements Uint32List {
   factory _Uint32List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2514,7 +2528,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Int64List extends _TypedList with _IntListMixin implements Int64List {
+class _Int64List extends _TypedList
+    with _IntListMixin<Int64List>
+    implements Int64List {
   factory _Int64List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2567,7 +2583,9 @@
 }
 
 @pragma("vm:entry-point")
-class _Uint64List extends _TypedList with _IntListMixin implements Uint64List {
+class _Uint64List extends _TypedList
+    with _IntListMixin<Uint64List>
+    implements Uint64List {
   factory _Uint64List._uninstantiable() {
     throw "Unreachable";
   }
@@ -2621,7 +2639,7 @@
 
 @pragma("vm:entry-point")
 class _Float32List extends _TypedList
-    with _DoubleListMixin
+    with _DoubleListMixin<Float32List>
     implements Float32List {
   factory _Float32List._uninstantiable() {
     throw "Unreachable";
@@ -2677,7 +2695,7 @@
 
 @pragma("vm:entry-point")
 class _Float64List extends _TypedList
-    with _DoubleListMixin
+    with _DoubleListMixin<Float64List>
     implements Float64List {
   factory _Float64List._uninstantiable() {
     throw "Unreachable";
@@ -2885,7 +2903,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalInt8Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Int8List>
     implements Int8List {
   factory _ExternalInt8Array._uninstantiable() {
     throw "Unreachable";
@@ -2919,7 +2937,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalUint8Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Uint8List>
     implements Uint8List {
   factory _ExternalUint8Array._uninstantiable() {
     throw "Unreachable";
@@ -2954,7 +2972,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalUint8ClampedArray extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Uint8ClampedList>
     implements Uint8ClampedList {
   factory _ExternalUint8ClampedArray._uninstantiable() {
     throw "Unreachable";
@@ -2989,7 +3007,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalInt16Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Int16List>
     implements Int16List {
   factory _ExternalInt16Array._uninstantiable() {
     throw "Unreachable";
@@ -3031,7 +3049,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalUint16Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Uint16List>
     implements Uint16List {
   factory _ExternalUint16Array._uninstantiable() {
     throw "Unreachable";
@@ -3073,7 +3091,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalInt32Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Int32List>
     implements Int32List {
   factory _ExternalInt32Array._uninstantiable() {
     throw "Unreachable";
@@ -3115,7 +3133,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalUint32Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Uint32List>
     implements Uint32List {
   factory _ExternalUint32Array._uninstantiable() {
     throw "Unreachable";
@@ -3157,7 +3175,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalInt64Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Int64List>
     implements Int64List {
   factory _ExternalInt64Array._uninstantiable() {
     throw "Unreachable";
@@ -3199,7 +3217,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalUint64Array extends _TypedList
-    with _IntListMixin
+    with _IntListMixin<Uint64List>
     implements Uint64List {
   factory _ExternalUint64Array._uninstantiable() {
     throw "Unreachable";
@@ -3241,7 +3259,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalFloat32Array extends _TypedList
-    with _DoubleListMixin
+    with _DoubleListMixin<Float32List>
     implements Float32List {
   factory _ExternalFloat32Array._uninstantiable() {
     throw "Unreachable";
@@ -3283,7 +3301,7 @@
 
 @pragma("vm:entry-point")
 class _ExternalFloat64Array extends _TypedList
-    with _DoubleListMixin
+    with _DoubleListMixin<Float64List>
     implements Float64List {
   factory _ExternalFloat64Array._uninstantiable() {
     throw "Unreachable";
@@ -3698,7 +3716,7 @@
 
 @pragma("vm:entry-point")
 class _Int8ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Int8List>
     implements Int8List {
   // Constructor.
   @pragma("vm:exact-result-type", _Int8ArrayView)
@@ -3735,7 +3753,7 @@
 
 @pragma("vm:entry-point")
 class _Uint8ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Uint8List>
     implements Uint8List {
   // Constructor.
   @pragma("vm:exact-result-type", _Uint8ArrayView)
@@ -3772,7 +3790,7 @@
 
 @pragma("vm:entry-point")
 class _Uint8ClampedArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Uint8ClampedList>
     implements Uint8ClampedList {
   // Constructor.
   @pragma("vm:exact-result-type", _Uint8ClampedArrayView)
@@ -3809,7 +3827,7 @@
 
 @pragma("vm:entry-point")
 class _Int16ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Int16List>
     implements Int16List {
   // Constructor.
   @pragma("vm:exact-result-type", _Int16ArrayView)
@@ -3858,7 +3876,7 @@
 
 @pragma("vm:entry-point")
 class _Uint16ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Uint16List>
     implements Uint16List {
   // Constructor.
   @pragma("vm:exact-result-type", _Uint16ArrayView)
@@ -3908,7 +3926,7 @@
 
 @pragma("vm:entry-point")
 class _Int32ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Int32List>
     implements Int32List {
   // Constructor.
   @pragma("vm:exact-result-type", _Int32ArrayView)
@@ -3945,7 +3963,7 @@
 
 @pragma("vm:entry-point")
 class _Uint32ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Uint32List>
     implements Uint32List {
   // Constructor.
   @pragma("vm:exact-result-type", _Uint32ArrayView)
@@ -3982,7 +4000,7 @@
 
 @pragma("vm:entry-point")
 class _Int64ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Int64List>
     implements Int64List {
   // Constructor.
   @pragma("vm:exact-result-type", _Int64ArrayView)
@@ -4019,7 +4037,7 @@
 
 @pragma("vm:entry-point")
 class _Uint64ArrayView extends _TypedListView
-    with _IntListMixin
+    with _IntListMixin<Uint64List>
     implements Uint64List {
   // Constructor.
   @pragma("vm:exact-result-type", _Uint64ArrayView)
@@ -4056,7 +4074,7 @@
 
 @pragma("vm:entry-point")
 class _Float32ArrayView extends _TypedListView
-    with _DoubleListMixin
+    with _DoubleListMixin<Float32List>
     implements Float32List {
   // Constructor.
   @pragma("vm:exact-result-type", _Float32ArrayView)
@@ -4093,7 +4111,7 @@
 
 @pragma("vm:entry-point")
 class _Float64ArrayView extends _TypedListView
-    with _DoubleListMixin
+    with _DoubleListMixin<Float64List>
     implements Float64List {
   // Constructor.
   @pragma("vm:exact-result-type", _Float64ArrayView)
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index 497516c..5c39ad4 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -85,14 +85,14 @@
     _buffer = newBuffer;
   }
 
-  List<int> takeBytes() {
+  Uint8List takeBytes() {
     if (_length == 0) return _emptyList;
     var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
     clear();
     return buffer;
   }
 
-  List<int> toBytes() {
+  Uint8List toBytes() {
     if (_length == 0) return _emptyList;
     return new Uint8List.fromList(
         new Uint8List.view(_buffer.buffer, 0, _length));
diff --git a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
index 4bc3ff5..5947ad1 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
@@ -171,7 +171,7 @@
     _storage[(index * 4) + 3] = value.w;
   }
 
-  List<Float32x4> sublist(int start, [int end]) {
+  Float32x4List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     return NativeFloat32x4List._externalStorage(
         _storage.sublist(start * 4, end * 4));
@@ -249,7 +249,7 @@
     _storage[(index * 4) + 3] = value.w;
   }
 
-  List<Int32x4> sublist(int start, [int end]) {
+  Int32x4List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     return NativeInt32x4List._externalStorage(
         _storage.sublist(start * 4, end * 4));
@@ -321,7 +321,7 @@
     _storage[(index * 2) + 1] = value.y;
   }
 
-  List<Float64x2> sublist(int start, [int end]) {
+  Float64x2List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     return NativeFloat64x2List._externalStorage(
         _storage.sublist(start * 2, end * 2));
@@ -831,7 +831,7 @@
 
   Type get runtimeType => Float32List;
 
-  List<double> sublist(int start, [int end]) {
+  Float32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -865,7 +865,7 @@
 
   Type get runtimeType => Float64List;
 
-  List<double> sublist(int start, [int end]) {
+  Float64List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -903,7 +903,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Int16List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeInt16List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -941,7 +941,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Int32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeInt32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -979,7 +979,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Int8List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeInt8List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -1017,7 +1017,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint16List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeUint16List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -1055,7 +1055,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeUint32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -1096,7 +1096,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint8ClampedList sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source =
         JS('NativeUint8ClampedList', '#.subarray(#, #)', this, start, end);
@@ -1145,7 +1145,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint8List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeUint8List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
diff --git a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
index 9fa9070..0a91641 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -163,7 +163,7 @@
     _storage[(index * 4) + 3] = value.w;
   }
 
-  List<Float32x4> sublist(int start, [int end]) {
+  Float32x4List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     return new NativeFloat32x4List._externalStorage(
         _storage.sublist(start * 4, end * 4));
@@ -235,7 +235,7 @@
     _storage[(index * 4) + 3] = value.w;
   }
 
-  List<Int32x4> sublist(int start, [int end]) {
+  Int32x4List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     return new NativeInt32x4List._externalStorage(
         _storage.sublist(start * 4, end * 4));
@@ -302,7 +302,7 @@
     _storage[(index * 2) + 1] = value.y;
   }
 
-  List<Float64x2> sublist(int start, [int end]) {
+  Float64x2List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     return new NativeFloat64x2List._externalStorage(
         _storage.sublist(start * 2, end * 2));
@@ -757,7 +757,7 @@
 
   Type get runtimeType => Float32List;
 
-  List<double> sublist(int start, [int end]) {
+  Float32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -791,7 +791,7 @@
 
   Type get runtimeType => Float64List;
 
-  List<double> sublist(int start, [int end]) {
+  Float64List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -829,7 +829,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Int16List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeInt16List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -867,7 +867,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Int32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeInt32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -905,7 +905,7 @@
     return JS('int', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Int8List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeInt8List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -943,7 +943,7 @@
     return JS('JSUInt31', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint16List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeUint16List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -981,7 +981,7 @@
     return JS('JSUInt32', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeUint32List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
@@ -1022,7 +1022,7 @@
     return JS('JSUInt31', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint8ClampedList sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source =
         JS('NativeUint8ClampedList', '#.subarray(#, #)', this, start, end);
@@ -1071,7 +1071,7 @@
     return JS('JSUInt31', '#[#]', this, index);
   }
 
-  List<int> sublist(int start, [int end]) {
+  Uint8List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source = JS('NativeUint8List', '#.subarray(#, #)', this, start, end);
     return _create1(source);
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 66c9cac..39eb135 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -75,7 +75,7 @@
   ///
   /// If [start] and [end] are provided, only the substring
   /// `string.substring(start, end)` is converted.
-  List<int> convert(String string, [int start = 0, int end]) {
+  Uint8List convert(String string, [int start = 0, int end]) {
     var stringLength = string.length;
     end = RangeError.checkValidRange(start, end, stringLength);
     var length = end - start;
@@ -117,7 +117,7 @@
 class _Utf8Encoder {
   int _carry = 0;
   int _bufferIndex = 0;
-  final List<int> _buffer;
+  final Uint8List _buffer;
 
   static const _DEFAULT_BYTE_BUFFER_SIZE = 1024;
 
@@ -127,7 +127,7 @@
       : _buffer = _createBuffer(bufferSize);
 
   /// Allow an implementation to pick the most efficient way of storing bytes.
-  static List<int> _createBuffer(int size) => Uint8List(size);
+  static Uint8List _createBuffer(int size) => Uint8List(size);
 
   /// Tries to combine the given [leadingSurrogate] with the [nextCodeUnit] and
   /// writes it to [_buffer].
diff --git a/sdk/lib/io/bytes_builder.dart b/sdk/lib/io/bytes_builder.dart
index 3962037..9113d44 100644
--- a/sdk/lib/io/bytes_builder.dart
+++ b/sdk/lib/io/bytes_builder.dart
@@ -48,14 +48,14 @@
    * The list returned is a view of the internal buffer, limited to the
    * [length].
    */
-  List<int> takeBytes();
+  Uint8List takeBytes();
 
   /**
    * Returns a copy of the current contents of the builder.
    *
    * Leaves the contents of the builder intact.
    */
-  List<int> toBytes();
+  Uint8List toBytes();
 
   /**
    * The number of bytes in the builder.
@@ -82,6 +82,7 @@
   // Start with 1024 bytes.
   static const int _initSize = 1024;
 
+  // Safe for reuse because a fixed-length empty list is immutable.
   static final _emptyList = new Uint8List(0);
 
   int _length = 0;
@@ -135,14 +136,14 @@
     _buffer = newBuffer;
   }
 
-  List<int> takeBytes() {
+  Uint8List takeBytes() {
     if (_length == 0) return _emptyList;
     var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
     clear();
     return buffer;
   }
 
-  List<int> toBytes() {
+  Uint8List toBytes() {
     if (_length == 0) return _emptyList;
     return new Uint8List.fromList(
         new Uint8List.view(_buffer.buffer, 0, _length));
@@ -191,7 +192,7 @@
     _length++;
   }
 
-  List<int> takeBytes() {
+  Uint8List takeBytes() {
     if (_length == 0) return _CopyingBytesBuilder._emptyList;
     if (_chunks.length == 1) {
       var buffer = _chunks[0];
@@ -208,7 +209,7 @@
     return buffer;
   }
 
-  List<int> toBytes() {
+  Uint8List toBytes() {
     if (_length == 0) return _CopyingBytesBuilder._emptyList;
     var buffer = new Uint8List(_length);
     int offset = 0;
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index eb3db4c..861ce47 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -505,17 +505,17 @@
 
   /**
    * Read the entire file contents as a list of bytes. Returns a
-   * `Future<List<int>>` that completes with the list of bytes that
+   * `Future<Uint8List>` that completes with the list of bytes that
    * is the contents of the file.
    */
-  Future<List<int>> readAsBytes();
+  Future<Uint8List> readAsBytes();
 
   /**
    * Synchronously read the entire file contents as a list of bytes.
    *
    * Throws a [FileSystemException] if the operation fails.
    */
-  List<int> readAsBytesSync();
+  Uint8List readAsBytesSync();
 
   /**
    * Read the entire file contents as a string using the given
@@ -682,7 +682,7 @@
   /**
    * Reads [bytes] bytes from a file and returns the result as a list of bytes.
    */
-  Future<List<int>> read(int bytes);
+  Future<Uint8List> read(int bytes);
 
   /**
    * Synchronously reads a maximum of [bytes] bytes from a file and
@@ -690,7 +690,7 @@
    *
    * Throws a [FileSystemException] if the operation fails.
    */
-  List<int> readSync(int bytes);
+  Uint8List readSync(int bytes);
 
   /**
    * Reads into an existing [List<int>] from the file. If [start] is present,
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 33c1352..68d8b1b 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -513,10 +513,10 @@
     return new IOSink(consumer, encoding: encoding);
   }
 
-  Future<List<int>> readAsBytes() {
-    Future<List<int>> readDataChunked(RandomAccessFile file) {
+  Future<Uint8List> readAsBytes() {
+    Future<Uint8List> readDataChunked(RandomAccessFile file) {
       var builder = new BytesBuilder(copy: false);
-      var completer = new Completer<List<int>>();
+      var completer = new Completer<Uint8List>();
       void read() {
         file.read(_blockSize).then((data) {
           if (data.length > 0) {
@@ -543,10 +543,10 @@
     });
   }
 
-  List<int> readAsBytesSync() {
+  Uint8List readAsBytesSync() {
     var opened = openSync();
     try {
-      List<int> data;
+      Uint8List data;
       var length = opened.lengthSync();
       if (length == 0) {
         // May be character device, try to read it in chunks.
@@ -741,19 +741,19 @@
     return result;
   }
 
-  Future<List<int>> read(int bytes) {
+  Future<Uint8List> read(int bytes) {
     ArgumentError.checkNotNull(bytes, 'bytes');
     return _dispatch(_IOService.fileRead, [null, bytes]).then((response) {
       if (_isErrorResponse(response)) {
         throw _exceptionFromResponse(response, "read failed", path);
       }
       _resourceInfo.addRead(response[1].length);
-      List<int> result = response[1];
+      Uint8List result = response[1];
       return result;
     });
   }
 
-  List<int> readSync(int bytes) {
+  Uint8List readSync(int bytes) {
     _checkAvailable();
     ArgumentError.checkNotNull(bytes, 'bytes');
     var result = _ops.read(bytes);
diff --git a/sdk/lib/typed_data/typed_data.dart b/sdk/lib/typed_data/typed_data.dart
index 62e7ee8..89c9496 100644
--- a/sdk/lib/typed_data/typed_data.dart
+++ b/sdk/lib/typed_data/typed_data.dart
@@ -772,6 +772,31 @@
     return buffer.asInt8List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is an `Int8List` containing the elements of this list at
+   * positions greater than or equal to [start] and less than [end] in the same
+   * order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Int8List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Int8List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Int8List sublist(int start, [int end]);
+
   static const int bytesPerElement = 1;
 }
 
@@ -829,6 +854,31 @@
    */
   List<int> operator +(List<int> other);
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Uint8List` containing the elements of this list at
+   * positions greater than or equal to [start] and less than [end] in the same
+   * order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Uint8List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Uint8List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Uint8List sublist(int start, [int end]);
+
   static const int bytesPerElement = 1;
 }
 
@@ -878,6 +928,31 @@
     return buffer.asUint8ClampedList(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Uint8ClampedList` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Uint8ClampedList.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Uint8ClampedList
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Uint8ClampedList sublist(int start, [int end]);
+
   static const int bytesPerElement = 1;
 }
 
@@ -930,6 +1005,31 @@
     return buffer.asInt16List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is an `Int16List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Int16List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Int16List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Int16List sublist(int start, [int end]);
+
   static const int bytesPerElement = 2;
 }
 
@@ -983,6 +1083,31 @@
     return buffer.asUint16List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Uint16List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Uint16List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Uint16List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Uint16List sublist(int start, [int end]);
+
   static const int bytesPerElement = 2;
 }
 
@@ -1035,6 +1160,31 @@
     return buffer.asInt32List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is an `Int32List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Int32List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Int32List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Int32List sublist(int start, [int end]);
+
   static const int bytesPerElement = 4;
 }
 
@@ -1088,6 +1238,31 @@
     return buffer.asUint32List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Uint32List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Uint32List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Uint32List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Uint32List sublist(int start, [int end]);
+
   static const int bytesPerElement = 4;
 }
 
@@ -1140,6 +1315,31 @@
     return buffer.asInt64List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is an `Int64List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Int64List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Int64List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Int64List sublist(int start, [int end]);
+
   static const int bytesPerElement = 8;
 }
 
@@ -1193,6 +1393,31 @@
     return buffer.asUint64List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Uint64List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Uint64List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Uint64List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Uint64List sublist(int start, [int end]);
+
   static const int bytesPerElement = 8;
 }
 
@@ -1246,6 +1471,31 @@
     return buffer.asFloat32List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Float32List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Float32List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Float32List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Float32List sublist(int start, [int end]);
+
   static const int bytesPerElement = 4;
 }
 
@@ -1292,6 +1542,31 @@
     return buffer.asFloat64List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Float64List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Float64List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Float64List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Float64List sublist(int start, [int end]);
+
   static const int bytesPerElement = 8;
 }
 
@@ -1345,6 +1620,31 @@
    */
   List<Float32x4> operator +(List<Float32x4> other);
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Float32x4List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Float32x4List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Float32x4List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Float32x4List sublist(int start, [int end]);
+
   static const int bytesPerElement = 16;
 }
 
@@ -1398,6 +1698,31 @@
    */
   List<Int32x4> operator +(List<Int32x4> other);
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is an `Int32x4list` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Int32x4list.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Int32x4list
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Int32x4List sublist(int start, [int end]);
+
   static const int bytesPerElement = 16;
 }
 
@@ -1451,6 +1776,31 @@
     return buffer.asFloat64x2List(offsetInBytes, length);
   }
 
+  /**
+   * Returns a new list containing the elements between [start] and [end].
+   *
+   * The new list is a `Float64x2List` containing the elements of this
+   * list at positions greater than or equal to [start] and less than [end] in
+   * the same order as they occur in this list.
+   *
+   * ```dart
+   * var numbers = Float64x2List.fromList([0, 1, 2, 3, 4]);
+   * print(numbers.sublist(1, 3)); // [1, 2]
+   * print(numbers.sublist(1, 3).runtimeType); // Float64x2List
+   * ```
+   *
+   * If [end] is omitted, it defaults to the [length] of this list.
+   *
+   * ```dart
+   * print(numbers.sublist(1)); // [1, 2, 3, 4]
+   * ```
+   *
+   * The `start` and `end` positions must satisfy the relations
+   * 0 ≤ `start` ≤ `end` ≤ `this.length`
+   * If `end` is equal to `start`, then the returned list is empty.
+   */
+  Float64x2List sublist(int start, [int end]);
+
   static const int bytesPerElement = 16;
 }
 
diff --git a/sdk/lib/typed_data/unmodifiable_typed_data.dart b/sdk/lib/typed_data/unmodifiable_typed_data.dart
index 4cc5af7..3549041 100644
--- a/sdk/lib/typed_data/unmodifiable_typed_data.dart
+++ b/sdk/lib/typed_data/unmodifiable_typed_data.dart
@@ -160,6 +160,16 @@
   int get lengthInBytes => _data.lengthInBytes;
 
   ByteBuffer get buffer => new UnmodifiableByteBufferView(_data.buffer);
+
+  L _createList(int length);
+
+  L sublist(int start, [int end]) {
+    end = RangeError.checkValidRange(start, end, length);
+    int sublistLength = end - start;
+    L result = _createList(sublistLength);
+    result.setRange(0, sublistLength, _list, start);
+    return result;
+  }
 }
 
 /**
@@ -170,6 +180,8 @@
     implements Uint8List {
   final Uint8List _list;
   UnmodifiableUint8ListView(Uint8List list) : _list = list;
+
+  Uint8List _createList(int length) => Uint8List(length);
 }
 
 /**
@@ -180,6 +192,8 @@
     implements Int8List {
   final Int8List _list;
   UnmodifiableInt8ListView(Int8List list) : _list = list;
+
+  Int8List _createList(int length) => Int8List(length);
 }
 
 /**
@@ -190,6 +204,8 @@
     implements Uint8ClampedList {
   final Uint8ClampedList _list;
   UnmodifiableUint8ClampedListView(Uint8ClampedList list) : _list = list;
+
+  Uint8ClampedList _createList(int length) => Uint8ClampedList(length);
 }
 
 /**
@@ -200,6 +216,8 @@
     implements Uint16List {
   final Uint16List _list;
   UnmodifiableUint16ListView(Uint16List list) : _list = list;
+
+  Uint16List _createList(int length) => Uint16List(length);
 }
 
 /**
@@ -210,6 +228,8 @@
     implements Int16List {
   final Int16List _list;
   UnmodifiableInt16ListView(Int16List list) : _list = list;
+
+  Int16List _createList(int length) => Int16List(length);
 }
 
 /**
@@ -220,6 +240,8 @@
     implements Uint32List {
   final Uint32List _list;
   UnmodifiableUint32ListView(Uint32List list) : _list = list;
+
+  Uint32List _createList(int length) => Uint32List(length);
 }
 
 /**
@@ -230,6 +252,8 @@
     implements Int32List {
   final Int32List _list;
   UnmodifiableInt32ListView(Int32List list) : _list = list;
+
+  Int32List _createList(int length) => Int32List(length);
 }
 
 /**
@@ -240,6 +264,8 @@
     implements Uint64List {
   final Uint64List _list;
   UnmodifiableUint64ListView(Uint64List list) : _list = list;
+
+  Uint64List _createList(int length) => Uint64List(length);
 }
 
 /**
@@ -250,6 +276,8 @@
     implements Int64List {
   final Int64List _list;
   UnmodifiableInt64ListView(Int64List list) : _list = list;
+
+  Int64List _createList(int length) => Int64List(length);
 }
 
 /**
@@ -260,6 +288,8 @@
     implements Int32x4List {
   final Int32x4List _list;
   UnmodifiableInt32x4ListView(Int32x4List list) : _list = list;
+
+  Int32x4List _createList(int length) => Int32x4List(length);
 }
 
 /**
@@ -270,6 +300,8 @@
     implements Float32x4List {
   final Float32x4List _list;
   UnmodifiableFloat32x4ListView(Float32x4List list) : _list = list;
+
+  Float32x4List _createList(int length) => Float32x4List(length);
 }
 
 /**
@@ -280,6 +312,8 @@
     implements Float64x2List {
   final Float64x2List _list;
   UnmodifiableFloat64x2ListView(Float64x2List list) : _list = list;
+
+  Float64x2List _createList(int length) => Float64x2List(length);
 }
 
 /**
@@ -290,6 +324,8 @@
     implements Float32List {
   final Float32List _list;
   UnmodifiableFloat32ListView(Float32List list) : _list = list;
+
+  Float32List _createList(int length) => Float32List(length);
 }
 
 /**
@@ -300,4 +336,6 @@
     implements Float64List {
   final Float64List _list;
   UnmodifiableFloat64ListView(Float64List list) : _list = list;
+
+  Float64List _createList(int length) => Float64List(length);
 }
