diff --git a/typed_data/BUILD.gn b/typed_data/BUILD.gn
index 496bdbf..e456cf4 100644
--- a/typed_data/BUILD.gn
+++ b/typed_data/BUILD.gn
@@ -10,16 +10,15 @@
   sources = [
     "dart_byte_data.cc",
     "dart_byte_data.h",
-    "float32_list.cc",
+    "typed_list.cc",
+    "typed_list.h",
+
+    # Deprecated.
     "float32_list.h",
-    "float64_list.cc",
     "float64_list.h",
-    "int32_list.cc",
     "int32_list.h",
-    "uint8_list.cc",
-    "uint8_list.h",
-    "uint16_list.cc",
     "uint16_list.h",
+    "uint8_list.h",
   ]
 
   deps = [
diff --git a/typed_data/float32_list.cc b/typed_data/float32_list.cc
deleted file mode 100644
index 89d6c12..0000000
--- a/typed_data/float32_list.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2015 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "tonic/typed_data/float32_list.h"
-
-#include "tonic/logging/dart_error.h"
-
-namespace tonic {
-
-Float32List::Float32List()
-    : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {}
-
-Float32List::Float32List(Dart_Handle list)
-    : data_(nullptr), num_elements_(0), dart_handle_(list) {
-  if (Dart_IsNull(list))
-    return;
-
-  Dart_TypedData_Type type;
-  Dart_TypedDataAcquireData(list, &type, reinterpret_cast<void**>(&data_),
-                            &num_elements_);
-  TONIC_DCHECK(!LogIfError(list));
-  if (type != Dart_TypedData_kFloat32)
-    Dart_ThrowException(ToDart("Non-genuine Float32List passed to engine."));
-}
-
-Float32List::Float32List(Float32List&& other)
-    : data_(other.data_),
-      num_elements_(other.num_elements_),
-      dart_handle_(other.dart_handle_) {
-  other.data_ = nullptr;
-  other.dart_handle_ = nullptr;
-}
-
-Float32List::~Float32List() {
-  Release();
-}
-
-void Float32List::Release() {
-  if (data_) {
-    Dart_TypedDataReleaseData(dart_handle_);
-    data_ = nullptr;
-    num_elements_ = 0;
-    dart_handle_ = nullptr;
-  }
-}
-
-Float32List DartConverter<Float32List>::FromArguments(Dart_NativeArguments args,
-                                                      int index,
-                                                      Dart_Handle& exception) {
-  Dart_Handle list = Dart_GetNativeArgument(args, index);
-  TONIC_DCHECK(!LogIfError(list));
-  return Float32List(list);
-}
-
-void DartConverter<Float32List>::SetReturnValue(Dart_NativeArguments args,
-                                                Float32List val) {
-  Dart_SetReturnValue(args, val.dart_handle());
-}
-
-}  // namespace tonic
diff --git a/typed_data/float32_list.h b/typed_data/float32_list.h
index 7976d84..fe2d60d 100644
--- a/typed_data/float32_list.h
+++ b/typed_data/float32_list.h
@@ -5,57 +5,8 @@
 #ifndef LIB_TONIC_TYPED_DATA_FLOAT32_LIST_H_
 #define LIB_TONIC_TYPED_DATA_FLOAT32_LIST_H_
 
-#include "third_party/dart/runtime/include/dart_api.h"
-#include "tonic/converter/dart_converter.h"
+#warning float32_list.h is deprecated; use typed_list.h instead.
 
-namespace tonic {
-
-// A simple wrapper around a Dart Float32List. It uses Dart_TypedDataAcquireData
-// to obtain a raw pointer to the data, which is released when this object is
-// destroyed.
-//
-// This is designed to be used with DartConverter only.
-class Float32List {
- public:
-  explicit Float32List(Dart_Handle list);
-  Float32List(Float32List&& other);
-  Float32List();
-  ~Float32List();
-
-  float& at(intptr_t i) {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-  const float& at(intptr_t i) const {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-
-  float& operator[](intptr_t i) { return at(i); }
-  const float& operator[](intptr_t i) const { return at(i); }
-
-  const float* data() const { return data_; }
-  intptr_t num_elements() const { return num_elements_; }
-  Dart_Handle dart_handle() const { return dart_handle_; }
-
-  void Release();
-
- private:
-  float* data_;
-  intptr_t num_elements_;
-  Dart_Handle dart_handle_;
-
-  Float32List(const Float32List& other) = delete;
-};
-
-template <>
-struct DartConverter<Float32List> {
-  static void SetReturnValue(Dart_NativeArguments args, Float32List val);
-  static Float32List FromArguments(Dart_NativeArguments args,
-                                   int index,
-                                   Dart_Handle& exception);
-};
-
-}  // namespace tonic
+#include "tonic/typed_data/typed_list.h"
 
 #endif  // LIB_TONIC_TYPED_DATA_FLOAT32_LIST_H_
diff --git a/typed_data/float64_list.cc b/typed_data/float64_list.cc
deleted file mode 100644
index 18768ee..0000000
--- a/typed_data/float64_list.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2015 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "tonic/typed_data/float64_list.h"
-
-#include "tonic/logging/dart_error.h"
-
-namespace tonic {
-
-Float64List::Float64List()
-    : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {}
-
-Float64List::Float64List(Dart_Handle list)
-    : data_(nullptr), num_elements_(0), dart_handle_(list) {
-  if (Dart_IsNull(list))
-    return;
-
-  Dart_TypedData_Type type;
-  Dart_TypedDataAcquireData(list, &type, reinterpret_cast<void**>(&data_),
-                            &num_elements_);
-  TONIC_DCHECK(!LogIfError(list));
-  if (type != Dart_TypedData_kFloat64)
-    Dart_ThrowException(ToDart("Non-genuine Float64List passed to engine."));
-}
-
-Float64List::Float64List(Float64List&& other)
-    : data_(other.data_),
-      num_elements_(other.num_elements_),
-      dart_handle_(other.dart_handle_) {
-  other.data_ = nullptr;
-  other.dart_handle_ = nullptr;
-}
-
-Float64List::~Float64List() {
-  Release();
-}
-
-void Float64List::Release() {
-  if (data_) {
-    Dart_TypedDataReleaseData(dart_handle_);
-    data_ = nullptr;
-    num_elements_ = 0;
-    dart_handle_ = nullptr;
-  }
-}
-
-Float64List DartConverter<Float64List>::FromArguments(Dart_NativeArguments args,
-                                                      int index,
-                                                      Dart_Handle& exception) {
-  Dart_Handle list = Dart_GetNativeArgument(args, index);
-  TONIC_DCHECK(!LogIfError(list));
-  return Float64List(list);
-}
-
-void DartConverter<Float64List>::SetReturnValue(Dart_NativeArguments args,
-                                                Float64List val) {
-  Dart_SetReturnValue(args, val.dart_handle());
-}
-
-}  // namespace tonic
diff --git a/typed_data/float64_list.h b/typed_data/float64_list.h
index c3ad99f..0a329e3 100644
--- a/typed_data/float64_list.h
+++ b/typed_data/float64_list.h
@@ -5,57 +5,8 @@
 #ifndef LIB_TONIC_TYPED_DATA_FLOAT64_LIST_H_
 #define LIB_TONIC_TYPED_DATA_FLOAT64_LIST_H_
 
-#include "third_party/dart/runtime/include/dart_api.h"
-#include "tonic/converter/dart_converter.h"
+#warning float64_list.h is deprecated; use typed_list.h instead.
 
-namespace tonic {
-
-// A simple wrapper around a Dart Float64List. It uses Dart_TypedDataAcquireData
-// to obtain a raw pointer to the data, which is released when this object is
-// destroyed.
-//
-// This is designed to be used with DartConverter only.
-class Float64List {
- public:
-  explicit Float64List(Dart_Handle list);
-  Float64List(Float64List&& other);
-  Float64List();
-  ~Float64List();
-
-  double& at(intptr_t i) {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-  const double& at(intptr_t i) const {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-
-  double& operator[](intptr_t i) { return at(i); }
-  const double& operator[](intptr_t i) const { return at(i); }
-
-  const double* data() const { return data_; }
-  intptr_t num_elements() const { return num_elements_; }
-  Dart_Handle dart_handle() const { return dart_handle_; }
-
-  void Release();
-
- private:
-  double* data_;
-  intptr_t num_elements_;
-  Dart_Handle dart_handle_;
-
-  Float64List(const Float64List& other) = delete;
-};
-
-template <>
-struct DartConverter<Float64List> {
-  static void SetReturnValue(Dart_NativeArguments args, Float64List val);
-  static Float64List FromArguments(Dart_NativeArguments args,
-                                   int index,
-                                   Dart_Handle& exception);
-};
-
-}  // namespace tonic
+#include "tonic/typed_data/typed_list.h"
 
 #endif  // LIB_TONIC_TYPED_DATA_FLOAT64_LIST_H_
diff --git a/typed_data/int32_list.cc b/typed_data/int32_list.cc
deleted file mode 100644
index abfe2f6..0000000
--- a/typed_data/int32_list.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2015 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "tonic/typed_data/int32_list.h"
-
-#include "tonic/logging/dart_error.h"
-
-namespace tonic {
-
-Int32List::Int32List()
-    : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {}
-
-Int32List::Int32List(Dart_Handle list)
-    : data_(nullptr), num_elements_(0), dart_handle_(list) {
-  if (Dart_IsNull(list))
-    return;
-
-  Dart_TypedData_Type type;
-  Dart_TypedDataAcquireData(list, &type, reinterpret_cast<void**>(&data_),
-                            &num_elements_);
-  TONIC_DCHECK(!LogIfError(list));
-  if (type != Dart_TypedData_kInt32)
-    Dart_ThrowException(ToDart("Non-genuine Int32List passed to engine."));
-}
-
-Int32List::Int32List(Int32List&& other)
-    : data_(other.data_),
-      num_elements_(other.num_elements_),
-      dart_handle_(other.dart_handle_) {
-  other.data_ = nullptr;
-  other.dart_handle_ = nullptr;
-}
-
-Int32List::~Int32List() {
-  Release();
-}
-
-void Int32List::Release() {
-  if (data_) {
-    Dart_TypedDataReleaseData(dart_handle_);
-    data_ = nullptr;
-    num_elements_ = 0;
-    dart_handle_ = nullptr;
-  }
-}
-
-Int32List DartConverter<Int32List>::FromArguments(Dart_NativeArguments args,
-                                                  int index,
-                                                  Dart_Handle& exception) {
-  Dart_Handle list = Dart_GetNativeArgument(args, index);
-  TONIC_DCHECK(!LogIfError(list));
-  return Int32List(list);
-}
-
-void DartConverter<Int32List>::SetReturnValue(Dart_NativeArguments args,
-                                              Int32List val) {
-  Dart_SetReturnValue(args, val.dart_handle());
-}
-
-}  // namespace tonic
diff --git a/typed_data/int32_list.h b/typed_data/int32_list.h
index a8876ce..8c31520 100644
--- a/typed_data/int32_list.h
+++ b/typed_data/int32_list.h
@@ -5,57 +5,8 @@
 #ifndef LIB_TONIC_TYPED_DATA_INT32_LIST_H_
 #define LIB_TONIC_TYPED_DATA_INT32_LIST_H_
 
-#include "third_party/dart/runtime/include/dart_api.h"
-#include "tonic/converter/dart_converter.h"
+#warning int32_list.h is deprecated; use typed_list.h instead.
 
-namespace tonic {
-
-// A simple wrapper around a Dart Int32List. It uses Dart_TypedDataAcquireData
-// to obtain a raw pointer to the data, which is released when this object is
-// destroyed.
-//
-// This is designed to be used with DartConverter only.
-class Int32List {
- public:
-  explicit Int32List(Dart_Handle list);
-  Int32List(Int32List&& other);
-  Int32List();
-  ~Int32List();
-
-  int32_t& at(intptr_t i) {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-  const int32_t& at(intptr_t i) const {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-
-  int32_t& operator[](intptr_t i) { return at(i); }
-  const int32_t& operator[](intptr_t i) const { return at(i); }
-
-  const int32_t* data() const { return data_; }
-  intptr_t num_elements() const { return num_elements_; }
-  Dart_Handle dart_handle() const { return dart_handle_; }
-
-  void Release();
-
- private:
-  int32_t* data_;
-  intptr_t num_elements_;
-  Dart_Handle dart_handle_;
-
-  Int32List(const Int32List& other) = delete;
-};
-
-template <>
-struct DartConverter<Int32List> {
-  static void SetReturnValue(Dart_NativeArguments args, Int32List val);
-  static Int32List FromArguments(Dart_NativeArguments args,
-                                 int index,
-                                 Dart_Handle& exception);
-};
-
-}  // namespace tonic
+#include "tonic/typed_data/typed_list.h"
 
 #endif  // LIB_TONIC_TYPED_DATA_INT32_LIST_H_
diff --git a/typed_data/typed_list.cc b/typed_data/typed_list.cc
new file mode 100644
index 0000000..91786c2
--- /dev/null
+++ b/typed_data/typed_list.cc
@@ -0,0 +1,104 @@
+// Copyright 2019 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "tonic/typed_data/typed_list.h"
+
+#include <cstring>
+
+#include "tonic/logging/dart_error.h"
+
+namespace tonic {
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+TypedList<kTypeName, ElemType>::TypedList()
+    : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {}
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+TypedList<kTypeName, ElemType>::TypedList(Dart_Handle list)
+    : data_(nullptr), num_elements_(0), dart_handle_(list) {
+  if (Dart_IsNull(list))
+    return;
+
+  Dart_TypedData_Type type;
+  Dart_TypedDataAcquireData(list, &type, reinterpret_cast<void**>(&data_),
+                            &num_elements_);
+  TONIC_DCHECK(!LogIfError(list));
+  if (type != kTypeName)
+    Dart_ThrowException(ToDart("Non-genuine TypedData passed to engine."));
+}
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+TypedList<kTypeName, ElemType>::TypedList(
+    TypedList<kTypeName, ElemType>&& other)
+    : data_(other.data_),
+      num_elements_(other.num_elements_),
+      dart_handle_(other.dart_handle_) {
+  other.data_ = nullptr;
+  other.num_elements_ = 0;
+  other.dart_handle_ = nullptr;
+}
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+TypedList<kTypeName, ElemType>::~TypedList() {
+  Release();
+}
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+void TypedList<kTypeName, ElemType>::Release() {
+  if (data_) {
+    Dart_TypedDataReleaseData(dart_handle_);
+    data_ = nullptr;
+    num_elements_ = 0;
+    dart_handle_ = nullptr;
+  }
+}
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+TypedList<kTypeName, ElemType>
+DartConverter<TypedList<kTypeName, ElemType>>::FromArguments(
+    Dart_NativeArguments args,
+    int index,
+    Dart_Handle& exception) {
+  Dart_Handle list = Dart_GetNativeArgument(args, index);
+  TONIC_DCHECK(!LogIfError(list));
+  return TypedList<kTypeName, ElemType>(list);
+}
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+void DartConverter<TypedList<kTypeName, ElemType>>::SetReturnValue(
+    Dart_NativeArguments args,
+    TypedList<kTypeName, ElemType> val) {
+  Dart_SetReturnValue(args, val.dart_handle());
+}
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+Dart_Handle DartConverter<TypedList<kTypeName, ElemType>>::ToDart(
+    const ElemType* buffer,
+    unsigned int length) {
+  const intptr_t buffer_length = static_cast<intptr_t>(length);
+  Dart_Handle array = Dart_NewTypedData(kTypeName, buffer_length);
+  TONIC_DCHECK(!LogIfError(array));
+  {
+    Dart_TypedData_Type type;
+    void* data = nullptr;
+    intptr_t data_length = 0;
+    Dart_TypedDataAcquireData(array, &type, &data, &data_length);
+    TONIC_CHECK(type == kTypeName);
+    TONIC_CHECK(data);
+    TONIC_CHECK(data_length == buffer_length);
+    std::memmove(data, buffer, data_length * sizeof(ElemType));
+    Dart_TypedDataReleaseData(array);
+  }
+  return array;
+}
+
+#define TONIC_TYPED_DATA_DEFINE(name, type)               \
+  template class TypedList<Dart_TypedData_k##name, type>; \
+  template struct DartConverter<name##List>;
+
+TONIC_TYPED_DATA_FOREACH(TONIC_TYPED_DATA_DEFINE)
+
+#undef TONIC_TYPED_DATA_DEFINE
+
+}  // namespace tonic
diff --git a/typed_data/typed_list.h b/typed_data/typed_list.h
new file mode 100644
index 0000000..f52bbcb
--- /dev/null
+++ b/typed_data/typed_list.h
@@ -0,0 +1,85 @@
+// Copyright 2016 The Fuchsia Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIB_TONIC_TYPED_DATA_TYPED_LIST_H_
+#define LIB_TONIC_TYPED_DATA_TYPED_LIST_H_
+
+#include "third_party/dart/runtime/include/dart_api.h"
+#include "tonic/converter/dart_converter.h"
+
+namespace tonic {
+
+// A simple wrapper around Dart TypedData objects. It uses
+// Dart_TypedDataAcquireData to obtain a raw pointer to the data, which is
+// released when this object is destroyed.
+//
+// This is designed to be used with DartConverter only.
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+class TypedList {
+ public:
+  explicit TypedList(Dart_Handle list);
+  TypedList(TypedList<kTypeName, ElemType>&& other);
+  TypedList();
+  ~TypedList();
+
+  ElemType& at(intptr_t i) {
+    TONIC_CHECK(0 <= i);
+    TONIC_CHECK(i < num_elements_);
+    return data_[i];
+  }
+  const ElemType& at(intptr_t i) const {
+    TONIC_CHECK(0 <= i);
+    TONIC_CHECK(i < num_elements_);
+    return data_[i];
+  }
+
+  ElemType& operator[](intptr_t i) { return at(i); }
+  const ElemType& operator[](intptr_t i) const { return at(i); }
+
+  const ElemType* data() const { return data_; }
+  intptr_t num_elements() const { return num_elements_; }
+  Dart_Handle dart_handle() const { return dart_handle_; }
+
+  void Release();
+
+ private:
+  ElemType* data_;
+  intptr_t num_elements_;
+  Dart_Handle dart_handle_;
+};
+
+template <Dart_TypedData_Type kTypeName, typename ElemType>
+struct DartConverter<TypedList<kTypeName, ElemType>> {
+  static void SetReturnValue(Dart_NativeArguments args,
+                             TypedList<kTypeName, ElemType> val);
+  static TypedList<kTypeName, ElemType> FromArguments(Dart_NativeArguments args,
+                                                      int index,
+                                                      Dart_Handle& exception);
+  static Dart_Handle ToDart(const ElemType* buffer, unsigned int length);
+};
+
+#define TONIC_TYPED_DATA_FOREACH(F) \
+  F(Int8, int8_t)                   \
+  F(Uint8, uint8_t)                 \
+  F(Int16, int16_t)                 \
+  F(Uint16, uint16_t)               \
+  F(Int32, int32_t)                 \
+  F(Uint32, uint32_t)               \
+  F(Int64, int64_t)                 \
+  F(Uint64, uint64_t)               \
+  F(Float32, float)                 \
+  F(Float64, double)
+
+#define TONIC_TYPED_DATA_DECLARE(name, type)                     \
+  using name##List = TypedList<Dart_TypedData_k##name, type>;    \
+  extern template class TypedList<Dart_TypedData_k##name, type>; \
+  extern template struct DartConverter<name##List>;
+
+TONIC_TYPED_DATA_FOREACH(TONIC_TYPED_DATA_DECLARE)
+
+#undef TONIC_TYPED_DATA_DECLARE
+
+}  // namespace tonic
+
+#endif  // LIB_TONIC_TYPED_DATA_TYPED_LIST_H_
diff --git a/typed_data/uint16_list.cc b/typed_data/uint16_list.cc
deleted file mode 100644
index 8a1f15a..0000000
--- a/typed_data/uint16_list.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2015 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "tonic/typed_data/uint16_list.h"
-
-#include <string.h>
-
-#include "tonic/logging/dart_error.h"
-
-namespace tonic {
-
-Uint16List::Uint16List()
-    : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {}
-
-Uint16List::Uint16List(Dart_Handle list)
-    : data_(nullptr), num_elements_(0), dart_handle_(list) {
-  if (Dart_IsNull(list))
-    return;
-
-  Dart_TypedData_Type type;
-  Dart_TypedDataAcquireData(list, &type, reinterpret_cast<void**>(&data_),
-                            &num_elements_);
-  TONIC_DCHECK(!LogIfError(list));
-  if (type != Dart_TypedData_kUint16)
-    Dart_ThrowException(ToDart("Non-genuine Uint16List passed to engine."));
-}
-
-Uint16List::Uint16List(Uint16List&& other)
-    : data_(other.data_),
-      num_elements_(other.num_elements_),
-      dart_handle_(other.dart_handle_) {
-  other.data_ = nullptr;
-  other.dart_handle_ = nullptr;
-}
-
-Uint16List::~Uint16List() {
-  Release();
-}
-
-void Uint16List::Release() {
-  if (data_) {
-    Dart_TypedDataReleaseData(dart_handle_);
-    data_ = nullptr;
-    num_elements_ = 0;
-    dart_handle_ = nullptr;
-  }
-}
-
-Uint16List DartConverter<Uint16List>::FromArguments(Dart_NativeArguments args,
-                                                    int index,
-                                                    Dart_Handle& exception) {
-  Dart_Handle list = Dart_GetNativeArgument(args, index);
-  TONIC_DCHECK(!LogIfError(list));
-  return Uint16List(list);
-}
-
-void DartConverter<Uint16List>::SetReturnValue(Dart_NativeArguments args,
-                                               Uint16List val) {
-  Dart_SetReturnValue(args, val.dart_handle());
-}
-
-Dart_Handle DartConverter<Uint16List>::ToDart(const uint16_t* buffer,
-                                              unsigned int length) {
-  const intptr_t buffer_length = static_cast<intptr_t>(length);
-  Dart_Handle array = Dart_NewTypedData(Dart_TypedData_kUint16, buffer_length);
-  TONIC_DCHECK(!LogIfError(array));
-  {
-    Dart_TypedData_Type type;
-    void* data = nullptr;
-    intptr_t data_length = 0;
-    Dart_TypedDataAcquireData(array, &type, &data, &data_length);
-    TONIC_CHECK(type == Dart_TypedData_kUint16);
-    TONIC_CHECK(data);
-    TONIC_CHECK(data_length == buffer_length);
-    memmove(data, buffer, data_length * sizeof(uint16_t));
-    Dart_TypedDataReleaseData(array);
-  }
-  return array;
-}
-
-}  // namespace tonic
diff --git a/typed_data/uint16_list.h b/typed_data/uint16_list.h
index f606893..708b35f 100644
--- a/typed_data/uint16_list.h
+++ b/typed_data/uint16_list.h
@@ -5,58 +5,8 @@
 #ifndef LIB_TONIC_TYPED_DATA_UINT16_LIST_H_
 #define LIB_TONIC_TYPED_DATA_UINT16_LIST_H_
 
-#include "third_party/dart/runtime/include/dart_api.h"
-#include "tonic/converter/dart_converter.h"
+#warning uint16_list.h is deprecated; use typed_list.h instead.
 
-namespace tonic {
-
-// A simple wrapper around a Dart Uint16List. It uses Dart_TypedDataAcquireData
-// to obtain a raw pointer to the data, which is released when this object is
-// destroyed.
-//
-// This is designed to be used with DartConverter only.
-class Uint16List {
- public:
-  explicit Uint16List(Dart_Handle list);
-  Uint16List(Uint16List&& other);
-  Uint16List();
-  ~Uint16List();
-
-  uint16_t& at(intptr_t i) {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-  const uint16_t& at(intptr_t i) const {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-
-  uint16_t& operator[](intptr_t i) { return at(i); }
-  const uint16_t& operator[](intptr_t i) const { return at(i); }
-
-  const uint16_t* data() const { return data_; }
-  intptr_t num_elements() const { return num_elements_; }
-  Dart_Handle dart_handle() const { return dart_handle_; }
-
-  void Release();
-
- private:
-  uint16_t* data_;
-  intptr_t num_elements_;
-  Dart_Handle dart_handle_;
-
-  Uint16List(const Uint16List& other) = delete;
-};
-
-template <>
-struct DartConverter<Uint16List> {
-  static void SetReturnValue(Dart_NativeArguments args, Uint16List val);
-  static Uint16List FromArguments(Dart_NativeArguments args,
-                                 int index,
-                                 Dart_Handle& exception);
-  static Dart_Handle ToDart(const uint16_t* buffer, unsigned int length);
-};
-
-}  // namespace tonic
+#include "tonic/typed_data/typed_list.h"
 
 #endif  // LIB_TONIC_TYPED_DATA_UINT16_LIST_H_
diff --git a/typed_data/uint8_list.cc b/typed_data/uint8_list.cc
deleted file mode 100644
index 8da7660..0000000
--- a/typed_data/uint8_list.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2015 The Fuchsia Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "tonic/typed_data/uint8_list.h"
-
-#include <string.h>
-
-#include "tonic/logging/dart_error.h"
-
-namespace tonic {
-
-Uint8List::Uint8List()
-    : data_(nullptr), num_elements_(0), dart_handle_(nullptr) {}
-
-Uint8List::Uint8List(Dart_Handle list)
-    : data_(nullptr), num_elements_(0), dart_handle_(list) {
-  if (Dart_IsNull(list))
-    return;
-
-  Dart_TypedData_Type type;
-  Dart_TypedDataAcquireData(list, &type, reinterpret_cast<void**>(&data_),
-                            &num_elements_);
-  TONIC_DCHECK(!LogIfError(list));
-  if (type != Dart_TypedData_kUint8)
-    Dart_ThrowException(ToDart("Non-genuine Uint8List passed to engine."));
-}
-
-Uint8List::Uint8List(Uint8List&& other)
-    : data_(other.data_),
-      num_elements_(other.num_elements_),
-      dart_handle_(other.dart_handle_) {
-  other.data_ = nullptr;
-  other.dart_handle_ = nullptr;
-}
-
-Uint8List::~Uint8List() {
-  Release();
-}
-
-void Uint8List::Release() {
-  if (data_) {
-    Dart_TypedDataReleaseData(dart_handle_);
-    data_ = nullptr;
-    num_elements_ = 0;
-    dart_handle_ = nullptr;
-  }
-}
-
-Uint8List DartConverter<Uint8List>::FromArguments(Dart_NativeArguments args,
-                                                  int index,
-                                                  Dart_Handle& exception) {
-  Dart_Handle list = Dart_GetNativeArgument(args, index);
-  TONIC_DCHECK(!LogIfError(list));
-  return Uint8List(list);
-}
-
-void DartConverter<Uint8List>::SetReturnValue(Dart_NativeArguments args,
-                                              Uint8List val) {
-  Dart_SetReturnValue(args, val.dart_handle());
-}
-
-Dart_Handle DartConverter<Uint8List>::ToDart(const uint8_t* buffer,
-                                             unsigned int length) {
-  const intptr_t buffer_length = static_cast<intptr_t>(length);
-  Dart_Handle array = Dart_NewTypedData(Dart_TypedData_kUint8, buffer_length);
-  TONIC_DCHECK(!LogIfError(array));
-  {
-    Dart_TypedData_Type type;
-    void* data = nullptr;
-    intptr_t data_length = 0;
-    Dart_TypedDataAcquireData(array, &type, &data, &data_length);
-    TONIC_CHECK(type == Dart_TypedData_kUint8);
-    TONIC_CHECK(data);
-    TONIC_CHECK(data_length == buffer_length);
-    memmove(data, buffer, data_length);
-    Dart_TypedDataReleaseData(array);
-  }
-  return array;
-}
-
-}  // namespace tonic
diff --git a/typed_data/uint8_list.h b/typed_data/uint8_list.h
index 77bb53c..f99c6a8 100644
--- a/typed_data/uint8_list.h
+++ b/typed_data/uint8_list.h
@@ -5,58 +5,8 @@
 #ifndef LIB_TONIC_TYPED_DATA_UINT8_LIST_H_
 #define LIB_TONIC_TYPED_DATA_UINT8_LIST_H_
 
-#include "third_party/dart/runtime/include/dart_api.h"
-#include "tonic/converter/dart_converter.h"
+#warning uint8_list.h is deprecated; use typed_list.h instead.
 
-namespace tonic {
-
-// A simple wrapper around a Dart Uint8List. It uses Dart_TypedDataAcquireData
-// to obtain a raw pointer to the data, which is released when this object is
-// destroyed.
-//
-// This is designed to be used with DartConverter only.
-class Uint8List {
- public:
-  explicit Uint8List(Dart_Handle list);
-  Uint8List(Uint8List&& other);
-  Uint8List();
-  ~Uint8List();
-
-  uint8_t& at(intptr_t i) {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-  const uint8_t& at(intptr_t i) const {
-    TONIC_CHECK(i < num_elements_);
-    return data_[i];
-  }
-
-  uint8_t& operator[](intptr_t i) { return at(i); }
-  const uint8_t& operator[](intptr_t i) const { return at(i); }
-
-  const uint8_t* data() const { return data_; }
-  intptr_t num_elements() const { return num_elements_; }
-  Dart_Handle dart_handle() const { return dart_handle_; }
-
-  void Release();
-
- private:
-  uint8_t* data_;
-  intptr_t num_elements_;
-  Dart_Handle dart_handle_;
-
-  Uint8List(const Uint8List& other) = delete;
-};
-
-template <>
-struct DartConverter<Uint8List> {
-  static void SetReturnValue(Dart_NativeArguments args, Uint8List val);
-  static Uint8List FromArguments(Dart_NativeArguments args,
-                                 int index,
-                                 Dart_Handle& exception);
-  static Dart_Handle ToDart(const uint8_t* buffer, unsigned int length);
-};
-
-}  // namespace tonic
+#include "tonic/typed_data/typed_list.h"
 
 #endif  // LIB_TONIC_TYPED_DATA_UINT8_LIST_H_
