Declare return types of Uint8List.

These methods all were returning Uint8List, yet they were only
declared to return List<int>. This forced callers to either defensively
wrap the return values in Uint8List, or to assume the contravariant
return value:

* Utf8Codec.encode()
* BytesBuilder.takeBytes()
* BytesBuilder.toBytes()
* File.readAsBytes()
* File.readAsBytesSync()
* RandomAccessFile.read()
* RandomAccessFile.readSync()
* Uint8List.sublist()

Since it's related, this change also updates the following sublist()
methods to declare that they return the a sublist of the same type as
the source list:

* Int8List
* Uint8ClampedList
* Int16List
* Uint16List
* Int32List
* Uint32List
* Int64List
* Uint64List
* Float32List
* Float64List
* Float32x4List
* Int32x4List
* Float64x2List

Bug: https://github.com/dart-lang/sdk/issues/36900
Bug: https://github.com/dart-lang/sdk/issues/31547
Bug: https://github.com/dart-lang/sdk/issues/27818
Bug: https://github.com/dart-lang/sdk/issues/35521
Change-Id: Ic3bc1db0d64de36fb68b1d8d98037eed1464f978
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101742
Commit-Queue: Todd Volkert <tvolkert@google.com>
Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
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);
 }