diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8efbd20..0d97adc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,9 @@
   `Hash.startChunkedConversion`—should be used in preference to the old APIs,
   which are now deprecated.
 
+* `SHA1`, `SHA256`, and `HMAC` have been renamed to `Sha1`, `Sha256`, and
+  `Hmac`, respectively. The old names still work, but are deprecated.
+
 * Top-level `sha1`, `sha256`, and `md5` fields have been added to make it easier
   to use those hash algorithms without having to instantiate new instances.
 
@@ -17,8 +20,20 @@
   `Hash.convert` should be used for hashing single values, and
   `Hash.startChunkedConversion` should be used for hashing streamed values.
   
-* `new SHA1()`, `new SHA256()`, and `new MD5()` are deprecated. Use the
-  top-level `sha1`, `sha256`, and `md5` fields instead.
+* `SHA1` and `SHA256` are deprecated. Use the top-level `sha1` and `sha256`
+  fields instead.
+
+* While the `MD5` class is not deprecated, the `new MD5()` constructor is. Use
+  the top-level `md5` field instead.
+
+* `HMAC` is deprecated. Use `Hmac` instead.
+
+* `Base64Codec`, `Base64Encoder`, `Base64Decoder`, `Base64EncoderSink`,
+  `Base64DecoderSink`, and `BASE64` are deprecated. Use the Base64 APIs in
+  `dart:convert` instead.
+
+* `CryptoUtils` is deprecated. Use the Base64 APIs in `dart:convert` and the hex
+  APIs in the `convert` package instead.
 
 ## 0.9.1
 
diff --git a/lib/src/base64.dart b/lib/src/base64.dart
index 9bea383..91d672b 100644
--- a/lib/src/base64.dart
+++ b/lib/src/base64.dart
@@ -7,14 +7,16 @@
 import 'base64/decoder.dart';
 import 'base64/encoder.dart';
 
-/// An instance of the default implementation of [Base64Codec].
+/// This is deprecated.
 ///
-/// This provides convenient access to most common Base64 use-cases.
+/// Use the `BASE64` constant in `dart:convert` instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
 const Base64Codec BASE64 = const Base64Codec();
 
-/// A codec that converts between binary data and [Base64][rfc]-encoded strings.
+/// This is deprecated.
 ///
-/// [rfc]: https://tools.ietf.org/html/rfc4648
+/// Use the `Base64Codec` class in `dart:convert` instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
 class Base64Codec extends Codec<List<int>, String> {
   final bool _urlSafe;
   final bool _addLineSeparator;
diff --git a/lib/src/base64/decoder.dart b/lib/src/base64/decoder.dart
index 19b3cf4..8f22a99 100644
--- a/lib/src/base64/decoder.dart
+++ b/lib/src/base64/decoder.dart
@@ -24,9 +24,10 @@
   38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51
 ];
 
-/// An encoder that converts [Base64][rfc] strings to sequences of bytes.
+/// This is deprecated.
 ///
-/// [rfc]: https://tools.ietf.org/html/rfc4648
+/// Use the `Base64Decoder` class in `dart:convert` instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
 class Base64Decoder extends Converter<String, List<int>> {
   const Base64Decoder();
 
diff --git a/lib/src/base64/decoder_sink.dart b/lib/src/base64/decoder_sink.dart
index 3fbf8fc..0a09a82 100644
--- a/lib/src/base64/decoder_sink.dart
+++ b/lib/src/base64/decoder_sink.dart
@@ -6,7 +6,10 @@
 
 import 'decoder.dart';
 
-/// A [ChunkedConversionSink] for decoding chunks of Base64 strings to data.
+/// This is deprecated.
+///
+/// Use the `Base64Decoder` class in `dart:convert` instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
 class Base64DecoderSink extends ChunkedConversionSink<String> {
   /// The encoder used to decode each chunk.
   final Base64Decoder _decoder = new Base64Decoder();
diff --git a/lib/src/base64/encoder.dart b/lib/src/base64/encoder.dart
index 7d688fc..bdbf6d8 100644
--- a/lib/src/base64/encoder.dart
+++ b/lib/src/base64/encoder.dart
@@ -25,9 +25,10 @@
 /// The line length for Base64 strings with line separators.
 const _lineLength = 76;
 
-/// An encoder that converts sequences of bytes to strings using [Base64][rfc].
+/// This is deprecated.
 ///
-/// [rfc]: https://tools.ietf.org/html/rfc4648
+/// Use the `Base64Encoder` class in `dart:convert` instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
 class Base64Encoder extends Converter<List<int>, String> {
   /// Whether this encoder generates URL-safe strings.
   final bool _urlSafe;
diff --git a/lib/src/base64/encoder_sink.dart b/lib/src/base64/encoder_sink.dart
index 3ba393b..293735b 100644
--- a/lib/src/base64/encoder_sink.dart
+++ b/lib/src/base64/encoder_sink.dart
@@ -6,7 +6,10 @@
 
 import 'encoder.dart';
 
-/// A [ChunkedConversionSink] for encoding chunks of data to Base64.
+/// This is deprecated.
+///
+/// Use the `Base64Encoder` class in `dart:convert` instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
 class Base64EncoderSink extends ChunkedConversionSink<List<int>> {
   /// The encoder used to encode each chunk.
   final Base64Encoder _encoder;
diff --git a/lib/src/crypto_utils.dart b/lib/src/crypto_utils.dart
index bcb8d03..4af507c 100644
--- a/lib/src/crypto_utils.dart
+++ b/lib/src/crypto_utils.dart
@@ -4,10 +4,12 @@
 
 import 'base64.dart';
 
-/// Utility methods for working with message digests.
+/// This class is deprecated.
+@Deprecated("Will be removed in crypto 1.0.0.")
 abstract class CryptoUtils {
-  /// Convert a list of bytes (for example a message digest) into a hexadecimal
-  /// string.
+  /// This is deprecated.
+  ///
+  /// Use `hex` from `package:convert` instead.
   static String bytesToHex(List<int> bytes) {
     var result = new StringBuffer();
     for (var part in bytes) {
@@ -16,30 +18,16 @@
     return result.toString();
   }
 
-  /// Converts a list of bytes into a [Base64-encoded][rfc] string.
+  /// This is deprecated.
   ///
-  /// [rfc]: https://tools.ietf.org/html/rfc4648
-  ///
-  /// The list can be any list of integers from 0 to 255 inclusive, for example
-  /// a message digest.
-  ///
-  /// If [addLineSeparator] is true, the resulting string will  be
-  /// broken into lines of 76 characters, separated by "\r\n".
-  ///
-  /// If [urlSafe] is true, the resulting string will be URL- and filename-
-  /// safe.
+  /// Use `BASE64` from `dart:convert` instead.
   static String bytesToBase64(List<int> bytes,
           {bool urlSafe: false, bool addLineSeparator: false}) =>
       BASE64.encode(bytes,
           urlSafe: urlSafe, addLineSeparator: addLineSeparator);
 
-  /// Converts a [Base64-encoded][rfc] String into list of bytes.
+  /// This is deprecated.
   ///
-  /// [rfc]: https://tools.ietf.org/html/rfc4648
-  ///
-  /// This ignores "\r\n" sequences in [input]. It accepts both URL-safe and
-  /// -unsafe Base 64 encoded strings.
-  ///
-  /// Throws a [FormatException] if [input] contains invalid characters.
+  /// Use `BASE64` from `dart:convert` instead.
   static List<int> base64StringToBytes(String input) => BASE64.decode(input);
 }
diff --git a/lib/src/digest.dart b/lib/src/digest.dart
index 44b8379..2e92fe2 100644
--- a/lib/src/digest.dart
+++ b/lib/src/digest.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import 'crypto_utils.dart';
+import 'package:convert/convert.dart';
 
 /// A message digest as computed by a [Hash] or [HMAC] function.
 class Digest {
@@ -29,5 +29,5 @@
   }
 
   /// The message digest as a string of hexadecimal digits.
-  String toString() => CryptoUtils.bytesToHex(bytes);
+  String toString() => hex.encode(bytes);
 }
diff --git a/lib/src/hash.dart b/lib/src/hash.dart
index 2013ca6..9714f42 100644
--- a/lib/src/hash.dart
+++ b/lib/src/hash.dart
@@ -40,21 +40,22 @@
 
   ByteConversionSink startChunkedConversion(Sink<Digest> sink);
 
-  /// Returns a new instance of this hash function.
-  @Deprecated("Expires in 1.0.0. Use Hash.startChunkedConversion() instead.")
+  /// This is deprecated.
+  ///
+  /// Use [startChunkedConversion] instead.
+  @Deprecated("Will be removed in crypto 1.0.0.")
   Hash newInstance();
 
-  /// Add a list of bytes to the hash computation.
+  /// This is deprecated.
   ///
-  /// If [this] has already been closed, throws a [StateError].
-  @Deprecated("Expires in 1.0.0. Use Hash.convert() or "
-      "Hash.startChunkedConversion() instead.")
+  /// Use [convert] or [startChunkedConversion] instead.
+  @Deprecated("Will be removed in crypto 1.0.0.")
   void add(List<int> data) => _sink.add(data);
 
-  /// Finish the hash computation and extract the message digest as a list of
-  /// bytes.
-  @Deprecated("Expires in 1.0.0. Use Hash.convert() or "
-      "Hash.startChunkedConversion() instead.")
+  /// This is deprecated.
+  ///
+  /// Use [convert] or [startChunkedConversion] instead.
+  @Deprecated("Will be removed in crypto 1.0.0.")
   List<int> close() {
     _sink.close();
     return _innerSink.value.bytes;
diff --git a/lib/src/hmac.dart b/lib/src/hmac.dart
index 8d86797..f1b9de2 100644
--- a/lib/src/hmac.dart
+++ b/lib/src/hmac.dart
@@ -17,28 +17,18 @@
 ///
 /// HMAC allows messages to be cryptographically authenticated using any
 /// iterated cryptographic hash function.
-class HMAC extends Converter<List<int>, Digest> {
+class Hmac extends Converter<List<int>, Digest> {
   /// The hash function used to compute the authentication digest.
   final Hash _hash;
 
   /// The secret key shared by the sender and the receiver.
   final Uint8List _key;
 
-  /// The bytes from the message so far.
-  final _message = new Uint8Buffer();
-
-  /// The sink for implementing the deprecated APIs that involved adding data
-  /// directly to the [HMAC] instance.
-  _HmacSink _sink;
-
-  /// The sink that [_sink] sends the [Digest] to once it finishes hashing.
-  DigestSink _innerSink;
-
   /// Create an [HMAC] object from a [Hash] and a binary key.
   ///
   /// The key should be a secret shared between the sender and receiver of the
   /// message.
-  HMAC(Hash hash, List<int> key)
+  Hmac(Hash hash, List<int> key)
       : _hash = hash,
         _key = new Uint8List(hash.blockSize) {
     // Hash the key if it's longer than the block size of the hash.
@@ -47,9 +37,6 @@
     // If [key] is shorter than the block size, the rest of [_key] will be
     // 0-padded.
     _key.setRange(0, key.length, key);
-
-    _innerSink = new DigestSink();
-    _sink = startChunkedConversion(_innerSink);
   }
 
   Digest convert(List<int> data) {
@@ -62,30 +49,44 @@
 
   ByteConversionSink startChunkedConversion(Sink<Digest> sink) =>
       new _HmacSink(sink, _hash, _key);
+}
 
-  /// Adds a list of bytes to the message.
+/// This is deprecated.
+///
+/// Use [Hmac] instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
+class HMAC {
+  final Hmac _hmac;
+
+  /// The sink for implementing the deprecated APIs that involved adding data
+  /// directly to the [HMAC] instance.
+  _HmacSink _sink;
+
+  /// The sink that [_sink] sends the [Digest] to once it finishes hashing.
+  DigestSink _innerSink;
+
+  /// The bytes from the message so far.
+  final _message = new Uint8Buffer();
+
+  /// Create an [HMAC] object from a [Hash] and a binary key.
   ///
-  /// If [this] has already been closed, throws a [StateError].
-  @Deprecated("Expires in 1.0.0. Use HMAC.convert() or "
-      "HMAC.startChunkedConversion() instead.")
+  /// The key should be a secret shared between the sender and receiver of the
+  /// message.
+  HMAC(Hash hash, List<int> key) : _hmac = new Hmac(hash, key) {
+    _innerSink = new DigestSink();
+    _sink = _hmac.startChunkedConversion(_innerSink);
+  }
+
   void add(List<int> data) {
     _message.addAll(data);
     _sink.add(data);
   }
 
-  /// Closes [this] and returns the digest of the message as a list of bytes.
-  ///
-  /// Once closed, [add] may no longer be called.
-  @Deprecated("Expires in 1.0.0. Use HMAC.convert() or "
-      "HMAC.startChunkedConversion() instead.")
   List<int> close() {
     _sink.close();
     return _innerSink.value.bytes;
   }
 
-  /// Returns the digest of the message so far, as a list of bytes.
-  @Deprecated("Expires in 1.0.0. Use HMAC.convert() or "
-      "HMAC.startChunkedConversion() instead.")
   List<int> get digest {
     if (_sink._isClosed) return _innerSink.value.bytes;
 
@@ -97,27 +98,18 @@
     var bytes = _innerSink.value.bytes;
 
     _innerSink = new DigestSink();
-    _sink = _hash.startChunkedConversion(_innerSink);
+    _sink = _hmac._hash.startChunkedConversion(_innerSink);
     _sink.add(_message);
 
     return bytes;
   }
 
-  /// Returns whether the digest computed for the data so far matches the given
-  /// [digest].
-  ///
-  /// This method should be used instead of iterative comparisons to avoid
-  /// leaking information via timing.
-  ///
-  /// Throws an [ArgumentError] if the given digest does not have the same size
-  /// as the digest computed by [this].
-  @Deprecated("Expires in 1.0.0. Use Digest.==() instead.")
   bool verify(List<int> digest) {
     var computedDigest = this.digest;
     if (digest.length != computedDigest.length) {
       throw new ArgumentError(
           'Invalid digest size: ${digest.length} in HMAC.verify. '
-          'Expected: ${_hash.blockSize}.');
+          'Expected: ${_hmac._hash.blockSize}.');
     }
 
     var result = 0;
diff --git a/lib/src/md5.dart b/lib/src/md5.dart
index 9f0da30..1374df7 100644
--- a/lib/src/md5.dart
+++ b/lib/src/md5.dart
@@ -32,7 +32,10 @@
 class MD5 extends Hash {
   final int blockSize = 16 * bytesPerWord;
 
-  @Deprecated("Use the md5 field instead.")
+  /// This constructor is deprecated.
+  ///
+  /// Use [md5] instead.
+  @Deprecated("Will be removed in crypto 1.0.0.")
   MD5();
 
   MD5 newInstance() => new MD5();
diff --git a/lib/src/sha1.dart b/lib/src/sha1.dart
index 008d2a9..9bb6411 100644
--- a/lib/src/sha1.dart
+++ b/lib/src/sha1.dart
@@ -10,36 +10,42 @@
 import 'hash_sink.dart';
 import 'utils.dart';
 
-/// An instance of [SHA1].
+/// An instance of [Sha1].
 ///
-/// This instance provides convenient access to the [SHA1][rfc] hash function.
+/// This instance provides convenient access to the [SHA-1][rfc] hash function.
 ///
 /// [rfc]: http://tools.ietf.org/html/rfc3174
-final sha1 = new SHA1();
+final sha1 = new Sha1._();
 
 /// An implementation of the [SHA-1][rfc] hash function.
 ///
 /// [rfc]: http://tools.ietf.org/html/rfc3174
-///
-/// Note that it's almost always easier to use [sha1] rather than creating a new
-/// instance.
-class SHA1 extends Hash {
+class Sha1 extends Hash {
   final int blockSize = 16 * bytesPerWord;
 
-  @Deprecated("Use the sha1 field instead.")
-  SHA1();
+  Sha1._();
 
-  SHA1 newInstance() => new SHA1();
+  Sha1 newInstance() => new Sha1._();
 
   ByteConversionSink startChunkedConversion(Sink<Digest> sink) =>
-      new ByteConversionSink.from(new _SHA1Sink(sink));
+      new ByteConversionSink.from(new _Sha1Sink(sink));
 }
 
-/// The concrete implementation of [SHA1].
+/// This class is deprecated.
+///
+/// Use [sha1] instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
+class SHA1 extends Sha1 {
+  SHA1() : super._();
+
+  SHA1 newInstance() => new SHA1();
+}
+
+/// The concrete implementation of [Sha1].
 ///
 /// This is separate so that it can extend [HashBase] without leaking additional
 /// public memebers.
-class _SHA1Sink extends HashSink {
+class _Sha1Sink extends HashSink {
   final digest = new Uint32List(5);
 
   /// The sixteen words from the original chunk, extended to 80 words.
@@ -48,7 +54,7 @@
   /// used across invocations of [updateHash].
   final Uint32List _extended;
 
-  _SHA1Sink(Sink<Digest> sink)
+  _Sha1Sink(Sink<Digest> sink)
       : _extended = new Uint32List(80),
         super(sink, 16) {
     digest[0] = 0x67452301;
diff --git a/lib/src/sha256.dart b/lib/src/sha256.dart
index e4ad757..61cd72f 100644
--- a/lib/src/sha256.dart
+++ b/lib/src/sha256.dart
@@ -10,12 +10,12 @@
 import 'hash_sink.dart';
 import 'utils.dart';
 
-/// An instance of [SHA256].
+/// An instance of [Sha256].
 ///
-/// This instance provides convenient access to the [SHA256][rfc] hash function.
+/// This instance provides convenient access to the [Sha256][rfc] hash function.
 ///
 /// [rfc]: http://tools.ietf.org/html/rfc6234
-final sha256 = new SHA256();
+final sha256 = new Sha256._();
 
 /// An implementation of the [SHA-256][rfc] hash function.
 ///
@@ -23,16 +23,25 @@
 ///
 /// Note that it's almost always easier to use [sha256] rather than creating a
 /// new instance.
-class SHA256 extends Hash {
+class Sha256 extends Hash {
   final int blockSize = 16 * bytesPerWord;
 
-  @Deprecated("Use the sha256 field instead.")
-  SHA256();
+  Sha256._();
 
-  SHA256 newInstance() => new SHA256();
+  Sha256 newInstance() => new Sha256._();
 
   ByteConversionSink startChunkedConversion(Sink<Digest> sink) =>
-      new ByteConversionSink.from(new _SHA256Sink(sink));
+      new ByteConversionSink.from(new _Sha256Sink(sink));
+}
+
+/// This class is deprecated.
+///
+/// Use [sha256] instead.
+@Deprecated("Will be removed in crypto 1.0.0.")
+class SHA256 extends Sha256 {
+  SHA256() : super._();
+
+  SHA256 newInstance() => new SHA256();
 }
 
 /// Data from a non-linear function that functions as reproducible noise.
@@ -50,11 +59,11 @@
   0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
 ];
 
-/// The concrete implementation of [SHA256].
+/// The concrete implementation of [Sha256].
 ///
 /// This is separate so that it can extend [HashBase] without leaking additional
 /// public memebers.
-class _SHA256Sink extends HashSink {
+class _Sha256Sink extends HashSink {
   final digest = new Uint32List(8);
 
   /// The sixteen words from the original chunk, extended to 64 words.
@@ -63,7 +72,7 @@
   /// used across invocations of [updateHash].
   final Uint32List _extended;
 
-  _SHA256Sink(Sink<Digest> sink)
+  _Sha256Sink(Sink<Digest> sink)
       : _extended = new Uint32List(64),
         super(sink, 16) {
     // Initial value of the hash parts. First 32 bits of the fractional parts
diff --git a/pubspec.yaml b/pubspec.yaml
index 800a115..16be73c 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,11 +1,12 @@
 name: crypto
-version: 0.9.2-dev
+version: 0.9.2
 author: Dart Team <misc@dartlang.org>
 description: Library of cryptographic functions.
 homepage: https://www.github.com/dart-lang/crypto
 environment:
   sdk: '>=1.8.0 <2.0.0'
 dependencies:
+  convert: '^1.0.0'
   charcode: '^1.1.0'
   typed_data: '^1.0.0'
 dev_dependencies:
diff --git a/test/hmac_md5_test.dart b/test/hmac_md5_test.dart
index f1fae7c..f1fcab3 100644
--- a/test/hmac_md5_test.dart
+++ b/test/hmac_md5_test.dart
@@ -11,7 +11,7 @@
   group("standard vector", () {
     for (var i = 0; i < _inputs.length; i++) {
       test(_macs[i], () {
-        expectHmacEquals(new MD5(), _inputs[i], _keys[i], _macs[i]);
+        expectHmacEquals(md5, _inputs[i], _keys[i], _macs[i]);
       });
     }
   });
diff --git a/test/hmac_sha1_test.dart b/test/hmac_sha1_test.dart
index 9f4a510..c7fc66d 100644
--- a/test/hmac_sha1_test.dart
+++ b/test/hmac_sha1_test.dart
@@ -12,7 +12,7 @@
   group("standard vector", () {
     for (var i = 0; i < _inputs.length; i++) {
       test(_macs[i], () {
-        expectHmacEquals(new SHA1(), _inputs[i], _keys[i], _macs[i]);
+        expectHmacEquals(sha1, _inputs[i], _keys[i], _macs[i]);
       });
     }
   });
diff --git a/test/hmac_sha256_test.dart b/test/hmac_sha256_test.dart
index 904a7f0..65fa419 100644
--- a/test/hmac_sha256_test.dart
+++ b/test/hmac_sha256_test.dart
@@ -12,7 +12,7 @@
   group("standard vector", () {
     for (var i = 0; i < _inputs.length; i++) {
       test(_macs[i], () {
-        expectHmacEquals(new SHA256(), _inputs[i], _keys[i], _macs[i]);
+        expectHmacEquals(sha256, _inputs[i], _keys[i], _macs[i]);
       });
     }
   });
diff --git a/test/utils.dart b/test/utils.dart
index 82b9f8a..dee342a 100644
--- a/test/utils.dart
+++ b/test/utils.dart
@@ -10,6 +10,6 @@
 
 /// Asserts that an HMAC using [hash] returns [mac] for [input] and [key].
 void expectHmacEquals(Hash hash, List<int> input, List<int> key, String mac) {
-  var hmac = new HMAC(hash, key);
+  var hmac = new Hmac(hash, key);
   expect(hmac.convert(input).toString(), startsWith(mac));
 }
