diff --git a/mojo/edk/embedder/embedder.cc b/mojo/edk/embedder/embedder.cc
index 29c5217..e6c2720 100644
--- a/mojo/edk/embedder/embedder.cc
+++ b/mojo/edk/embedder/embedder.cc
@@ -148,7 +148,7 @@
   if (!dispatcher)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  if (dispatcher->GetType() != system::Dispatcher::kTypePlatformHandle)
+  if (dispatcher->GetType() != system::Dispatcher::Type::PLATFORM_HANDLE)
     return MOJO_RESULT_INVALID_ARGUMENT;
 
   *platform_handle =
diff --git a/mojo/edk/system/channel_endpoint_id.h b/mojo/edk/system/channel_endpoint_id.h
index c673258..afacb4e 100644
--- a/mojo/edk/system/channel_endpoint_id.h
+++ b/mojo/edk/system/channel_endpoint_id.h
@@ -81,8 +81,9 @@
               "ChannelEndpointId has incorrect size");
 
 // So logging macros and |DCHECK_EQ()|, etc. work.
-inline std::ostream& operator<<(std::ostream& out,
-                                const ChannelEndpointId& channel_endpoint_id) {
+MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<(
+    std::ostream& out,
+    const ChannelEndpointId& channel_endpoint_id) {
   return out << channel_endpoint_id.value();
 }
 
diff --git a/mojo/edk/system/core_test_base.cc b/mojo/edk/system/core_test_base.cc
index 7196886..0e58363 100644
--- a/mojo/edk/system/core_test_base.cc
+++ b/mojo/edk/system/core_test_base.cc
@@ -30,7 +30,7 @@
   }
 
   // |Dispatcher| private methods:
-  Type GetType() const override { return kTypeUnknown; }
+  Type GetType() const override { return Type::UNKNOWN; }
 
  private:
   ~MockDispatcher() override { info_->IncrementDtorCallCount(); }
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
index bee4b23..076b724 100644
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc
+++ b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
@@ -20,7 +20,7 @@
 }
 
 Dispatcher::Type DataPipeConsumerDispatcher::GetType() const {
-  return kTypeDataPipeConsumer;
+  return Type::DATA_PIPE_CONSUMER;
 }
 
 // static
diff --git a/mojo/edk/system/data_pipe_impl_unittest.cc b/mojo/edk/system/data_pipe_impl_unittest.cc
index 3a77488..1688e3d 100644
--- a/mojo/edk/system/data_pipe_impl_unittest.cc
+++ b/mojo/edk/system/data_pipe_impl_unittest.cc
@@ -376,7 +376,7 @@
     EXPECT_TRUE(to_send->HasOneRef());
     to_send = nullptr;
 
-    ASSERT_EQ(Dispatcher::kTypeDataPipeProducer, to_receive->GetType());
+    ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType());
     producer_dispatcher_ =
         static_cast<DataPipeProducerDispatcher*>(to_receive.get());
   }
@@ -426,7 +426,7 @@
     EXPECT_TRUE(to_send->HasOneRef());
     to_send = nullptr;
 
-    ASSERT_EQ(Dispatcher::kTypeDataPipeConsumer, to_receive->GetType());
+    ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType());
     consumer_dispatcher_ =
         static_cast<DataPipeConsumerDispatcher*>(to_receive.get());
   }
@@ -480,7 +480,7 @@
     // destroyed.
     EXPECT_TRUE(to_send->HasOneRef());
     to_send = nullptr;
-    ASSERT_EQ(Dispatcher::kTypeDataPipeProducer, to_receive->GetType());
+    ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType());
     to_send = static_cast<DataPipeProducerDispatcher*>(to_receive.get());
     to_receive = nullptr;
 
@@ -491,7 +491,7 @@
     EXPECT_TRUE(to_send->HasOneRef());
     to_send = nullptr;
 
-    ASSERT_EQ(Dispatcher::kTypeDataPipeProducer, to_receive->GetType());
+    ASSERT_EQ(Dispatcher::Type::DATA_PIPE_PRODUCER, to_receive->GetType());
     producer_dispatcher_ =
         static_cast<DataPipeProducerDispatcher*>(to_receive.get());
   }
@@ -527,7 +527,7 @@
     // destroyed.
     EXPECT_TRUE(to_send->HasOneRef());
     to_send = nullptr;
-    ASSERT_EQ(Dispatcher::kTypeDataPipeConsumer, to_receive->GetType());
+    ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType());
     to_send = static_cast<DataPipeConsumerDispatcher*>(to_receive.get());
     to_receive = nullptr;
 
@@ -538,7 +538,7 @@
     EXPECT_TRUE(to_send->HasOneRef());
     to_send = nullptr;
 
-    ASSERT_EQ(Dispatcher::kTypeDataPipeConsumer, to_receive->GetType());
+    ASSERT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER, to_receive->GetType());
     consumer_dispatcher_ =
         static_cast<DataPipeConsumerDispatcher*>(to_receive.get());
   }
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.cc b/mojo/edk/system/data_pipe_producer_dispatcher.cc
index 2480097..ccd0291 100644
--- a/mojo/edk/system/data_pipe_producer_dispatcher.cc
+++ b/mojo/edk/system/data_pipe_producer_dispatcher.cc
@@ -20,7 +20,7 @@
 }
 
 Dispatcher::Type DataPipeProducerDispatcher::GetType() const {
-  return kTypeDataPipeProducer;
+  return Type::DATA_PIPE_PRODUCER;
 }
 
 // static
diff --git a/mojo/edk/system/dispatcher.cc b/mojo/edk/system/dispatcher.cc
index e8695e8..24f2c26 100644
--- a/mojo/edk/system/dispatcher.cc
+++ b/mojo/edk/system/dispatcher.cc
@@ -71,23 +71,23 @@
     const void* source,
     size_t size,
     embedder::PlatformHandleVector* platform_handles) {
-  switch (static_cast<int32_t>(type)) {
-    case kTypeUnknown:
+  switch (static_cast<Dispatcher::Type>(type)) {
+    case Type::UNKNOWN:
       DVLOG(2) << "Deserializing invalid handle";
       return nullptr;
-    case kTypeMessagePipe:
+    case Type::MESSAGE_PIPE:
       return scoped_refptr<Dispatcher>(
           MessagePipeDispatcher::Deserialize(channel, source, size));
-    case kTypeDataPipeProducer:
+    case Type::DATA_PIPE_PRODUCER:
       return scoped_refptr<Dispatcher>(
           DataPipeProducerDispatcher::Deserialize(channel, source, size));
-    case kTypeDataPipeConsumer:
+    case Type::DATA_PIPE_CONSUMER:
       return scoped_refptr<Dispatcher>(
           DataPipeConsumerDispatcher::Deserialize(channel, source, size));
-    case kTypeSharedBuffer:
+    case Type::SHARED_BUFFER:
       return scoped_refptr<Dispatcher>(SharedBufferDispatcher::Deserialize(
           channel, source, size, platform_handles));
-    case kTypePlatformHandle:
+    case Type::PLATFORM_HANDLE:
       return scoped_refptr<Dispatcher>(PlatformHandleDispatcher::Deserialize(
           channel, source, size, platform_handles));
   }
diff --git a/mojo/edk/system/dispatcher.h b/mojo/edk/system/dispatcher.h
index 8d7e1cb..d7b7780 100644
--- a/mojo/edk/system/dispatcher.h
+++ b/mojo/edk/system/dispatcher.h
@@ -8,6 +8,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <ostream>
 #include <vector>
 
 #include "base/macros.h"
@@ -59,15 +60,15 @@
 class MOJO_SYSTEM_IMPL_EXPORT Dispatcher
     : public base::RefCountedThreadSafe<Dispatcher> {
  public:
-  enum Type {
-    kTypeUnknown = 0,
-    kTypeMessagePipe,
-    kTypeDataPipeProducer,
-    kTypeDataPipeConsumer,
-    kTypeSharedBuffer,
+  enum class Type {
+    UNKNOWN = 0,
+    MESSAGE_PIPE,
+    DATA_PIPE_PRODUCER,
+    DATA_PIPE_CONSUMER,
+    SHARED_BUFFER,
 
     // "Private" types (not exposed via the public interface):
-    kTypePlatformHandle = -1
+    PLATFORM_HANDLE = -1
   };
   virtual Type GetType() const = 0;
 
@@ -399,6 +400,12 @@
   // Copy and assign allowed.
 };
 
+// So logging macros and |DCHECK_EQ()|, etc. work.
+MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<(std::ostream& out,
+                                                        Dispatcher::Type type) {
+  return out << static_cast<int>(type);
+}
+
 }  // namespace system
 }  // namespace mojo
 
diff --git a/mojo/edk/system/dispatcher_unittest.cc b/mojo/edk/system/dispatcher_unittest.cc
index 97e2eed..2b853d2 100644
--- a/mojo/edk/system/dispatcher_unittest.cc
+++ b/mojo/edk/system/dispatcher_unittest.cc
@@ -23,7 +23,7 @@
  public:
   TrivialDispatcher() {}
 
-  Type GetType() const override { return kTypeUnknown; }
+  Type GetType() const override { return Type::UNKNOWN; }
 
  private:
   friend class base::RefCountedThreadSafe<TrivialDispatcher>;
@@ -41,7 +41,7 @@
 TEST(DispatcherTest, Basic) {
   scoped_refptr<Dispatcher> d(new TrivialDispatcher());
 
-  EXPECT_EQ(Dispatcher::kTypeUnknown, d->GetType());
+  EXPECT_EQ(Dispatcher::Type::UNKNOWN, d->GetType());
 
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
             d->WriteMessage(NullUserPointer(), 0, nullptr,
diff --git a/mojo/edk/system/message_in_transit.cc b/mojo/edk/system/message_in_transit.cc
index 47148f3..4909336 100644
--- a/mojo/edk/system/message_in_transit.cc
+++ b/mojo/edk/system/message_in_transit.cc
@@ -205,13 +205,5 @@
   }
 }
 
-std::ostream& operator<<(std::ostream& out, MessageInTransit::Type type) {
-  return out << static_cast<uint16_t>(type);
-}
-
-std::ostream& operator<<(std::ostream& out, MessageInTransit::Subtype subtype) {
-  return out << static_cast<uint16_t>(subtype);
-}
-
 }  // namespace system
 }  // namespace mojo
diff --git a/mojo/edk/system/message_in_transit.h b/mojo/edk/system/message_in_transit.h
index 946308c..7e79c48 100644
--- a/mojo/edk/system/message_in_transit.h
+++ b/mojo/edk/system/message_in_transit.h
@@ -8,7 +8,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <iosfwd>
+#include <ostream>
 #include <vector>
 
 #include "base/macros.h"
@@ -284,10 +284,19 @@
   DISALLOW_COPY_AND_ASSIGN(MessageInTransit);
 };
 
-// Stream operator for |MessageInTransit::Type| and |Subtype| so we can use
-// |CHECK_EQ()|, |EXPECT_EQ()|, etc.
-std::ostream& operator<<(std::ostream& out, MessageInTransit::Type type);
-std::ostream& operator<<(std::ostream& out, MessageInTransit::Subtype subtype);
+// So logging macros and |DCHECK_EQ()|, etc. work.
+MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<(
+    std::ostream& out,
+    MessageInTransit::Type type) {
+  return out << static_cast<uint16_t>(type);
+}
+
+// So logging macros and |DCHECK_EQ()|, etc. work.
+MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<(
+    std::ostream& out,
+    MessageInTransit::Subtype subtype) {
+  return out << static_cast<uint16_t>(subtype);
+}
 
 }  // namespace system
 }  // namespace mojo
diff --git a/mojo/edk/system/message_pipe.cc b/mojo/edk/system/message_pipe.cc
index 473bf5d..b17344c 100644
--- a/mojo/edk/system/message_pipe.cc
+++ b/mojo/edk/system/message_pipe.cc
@@ -352,7 +352,7 @@
   for (size_t i = 0; i < transports->size(); i++) {
     if (!(*transports)[i].is_valid())
       continue;
-    if ((*transports)[i].GetType() == Dispatcher::kTypeMessagePipe) {
+    if ((*transports)[i].GetType() == Dispatcher::Type::MESSAGE_PIPE) {
       MessagePipeDispatcherTransport mp_transport((*transports)[i]);
       if (mp_transport.GetMessagePipe() == this) {
         // The other case should have been disallowed by |Core|. (Note: |port|
diff --git a/mojo/edk/system/message_pipe_dispatcher.cc b/mojo/edk/system/message_pipe_dispatcher.cc
index a6733db..95faede 100644
--- a/mojo/edk/system/message_pipe_dispatcher.cc
+++ b/mojo/edk/system/message_pipe_dispatcher.cc
@@ -68,7 +68,7 @@
 }
 
 Dispatcher::Type MessagePipeDispatcher::GetType() const {
-  return kTypeMessagePipe;
+  return Type::MESSAGE_PIPE;
 }
 
 // static
@@ -223,7 +223,8 @@
 MessagePipeDispatcherTransport::MessagePipeDispatcherTransport(
     DispatcherTransport transport)
     : DispatcherTransport(transport) {
-  DCHECK_EQ(message_pipe_dispatcher()->GetType(), Dispatcher::kTypeMessagePipe);
+  DCHECK_EQ(message_pipe_dispatcher()->GetType(),
+            Dispatcher::Type::MESSAGE_PIPE);
 }
 
 }  // namespace system
diff --git a/mojo/edk/system/message_pipe_dispatcher_unittest.cc b/mojo/edk/system/message_pipe_dispatcher_unittest.cc
index 760aced..55aedb3 100644
--- a/mojo/edk/system/message_pipe_dispatcher_unittest.cc
+++ b/mojo/edk/system/message_pipe_dispatcher_unittest.cc
@@ -43,7 +43,7 @@
   for (unsigned i = 0; i < 2; i++) {
     scoped_refptr<MessagePipeDispatcher> d0(new MessagePipeDispatcher(
         MessagePipeDispatcher::kDefaultCreateOptions));
-    EXPECT_EQ(Dispatcher::kTypeMessagePipe, d0->GetType());
+    EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, d0->GetType());
     scoped_refptr<MessagePipeDispatcher> d1(new MessagePipeDispatcher(
         MessagePipeDispatcher::kDefaultCreateOptions));
     {
diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
index 3512868..ed2f30f 100644
--- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
+++ b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
@@ -240,7 +240,7 @@
   CHECK_EQ(read_buffer, std::string("go 1"));
   CHECK_EQ(num_dispatchers, 1u);
 
-  CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::kTypeSharedBuffer);
+  CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::Type::SHARED_BUFFER);
 
   scoped_refptr<SharedBufferDispatcher> dispatcher(
       static_cast<SharedBufferDispatcher*>(dispatchers[0].get()));
@@ -424,7 +424,7 @@
   CHECK_GT(num_handles, 0);
 
   for (int i = 0; i < num_handles; ++i) {
-    CHECK_EQ(dispatchers[i]->GetType(), Dispatcher::kTypePlatformHandle);
+    CHECK_EQ(dispatchers[i]->GetType(), Dispatcher::Type::PLATFORM_HANDLE);
 
     scoped_refptr<PlatformHandleDispatcher> dispatcher(
         static_cast<PlatformHandleDispatcher*>(dispatchers[i].get()));
diff --git a/mojo/edk/system/platform_handle_dispatcher.cc b/mojo/edk/system/platform_handle_dispatcher.cc
index f064c67..94e10e2 100644
--- a/mojo/edk/system/platform_handle_dispatcher.cc
+++ b/mojo/edk/system/platform_handle_dispatcher.cc
@@ -32,7 +32,7 @@
 }
 
 Dispatcher::Type PlatformHandleDispatcher::GetType() const {
-  return kTypePlatformHandle;
+  return Type::PLATFORM_HANDLE;
 }
 
 // static
diff --git a/mojo/edk/system/platform_handle_dispatcher_unittest.cc b/mojo/edk/system/platform_handle_dispatcher_unittest.cc
index dae53b4..3b37b72 100644
--- a/mojo/edk/system/platform_handle_dispatcher_unittest.cc
+++ b/mojo/edk/system/platform_handle_dispatcher_unittest.cc
@@ -39,7 +39,7 @@
   scoped_refptr<PlatformHandleDispatcher> dispatcher(
       new PlatformHandleDispatcher(h.Pass()));
   EXPECT_FALSE(h.is_valid());
-  EXPECT_EQ(Dispatcher::kTypePlatformHandle, dispatcher->GetType());
+  EXPECT_EQ(Dispatcher::Type::PLATFORM_HANDLE, dispatcher->GetType());
 
   h = dispatcher->PassPlatformHandle().Pass();
   EXPECT_TRUE(h.is_valid());
@@ -79,7 +79,7 @@
   DispatcherTransport transport(
       test::DispatcherTryStartTransport(dispatcher.get()));
   EXPECT_TRUE(transport.is_valid());
-  EXPECT_EQ(Dispatcher::kTypePlatformHandle, transport.GetType());
+  EXPECT_EQ(Dispatcher::Type::PLATFORM_HANDLE, transport.GetType());
   EXPECT_FALSE(transport.IsBusy());
 
   scoped_refptr<Dispatcher> generic_dispatcher =
@@ -90,7 +90,7 @@
   EXPECT_TRUE(dispatcher->HasOneRef());
   dispatcher = nullptr;
 
-  ASSERT_EQ(Dispatcher::kTypePlatformHandle, generic_dispatcher->GetType());
+  ASSERT_EQ(Dispatcher::Type::PLATFORM_HANDLE, generic_dispatcher->GetType());
   dispatcher = static_cast<PlatformHandleDispatcher*>(generic_dispatcher.get());
 
   fp = mojo::test::FILEFromPlatformHandle(dispatcher->PassPlatformHandle(),
diff --git a/mojo/edk/system/remote_data_pipe_impl_unittest.cc b/mojo/edk/system/remote_data_pipe_impl_unittest.cc
index 7efd40a..40d2f6f 100644
--- a/mojo/edk/system/remote_data_pipe_impl_unittest.cc
+++ b/mojo/edk/system/remote_data_pipe_impl_unittest.cc
@@ -226,7 +226,8 @@
   ASSERT_TRUE(read_dispatchers[0]);
   EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
 
-  EXPECT_EQ(Dispatcher::kTypeDataPipeConsumer, read_dispatchers[0]->GetType());
+  EXPECT_EQ(Dispatcher::Type::DATA_PIPE_CONSUMER,
+            read_dispatchers[0]->GetType());
   consumer =
       static_cast<DataPipeConsumerDispatcher*>(read_dispatchers[0].get());
   read_dispatchers.clear();
diff --git a/mojo/edk/system/remote_message_pipe_unittest.cc b/mojo/edk/system/remote_message_pipe_unittest.cc
index 1860c23..6d22da7 100644
--- a/mojo/edk/system/remote_message_pipe_unittest.cc
+++ b/mojo/edk/system/remote_message_pipe_unittest.cc
@@ -674,7 +674,7 @@
   ASSERT_TRUE(read_dispatchers[0]);
   EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
 
-  EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType());
+  EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, read_dispatchers[0]->GetType());
   dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get());
 
   // Add the waiter now, before it becomes readable to avoid a race.
@@ -848,7 +848,7 @@
   ASSERT_TRUE(read_dispatchers[0]);
   EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
 
-  EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType());
+  EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, read_dispatchers[0]->GetType());
   dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get());
 
   // |dispatcher| should already be readable and not writable.
@@ -982,7 +982,7 @@
   ASSERT_TRUE(read_dispatchers[0]);
   EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
 
-  EXPECT_EQ(Dispatcher::kTypeSharedBuffer, read_dispatchers[0]->GetType());
+  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, read_dispatchers[0]->GetType());
   dispatcher = static_cast<SharedBufferDispatcher*>(read_dispatchers[0].get());
 
   // Make another mapping.
@@ -1101,7 +1101,7 @@
   ASSERT_TRUE(read_dispatchers[0]);
   EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
 
-  EXPECT_EQ(Dispatcher::kTypePlatformHandle, read_dispatchers[0]->GetType());
+  EXPECT_EQ(Dispatcher::Type::PLATFORM_HANDLE, read_dispatchers[0]->GetType());
   dispatcher =
       static_cast<PlatformHandleDispatcher*>(read_dispatchers[0].get());
 
@@ -1238,7 +1238,7 @@
   ASSERT_TRUE(read_dispatchers[0]);
   EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
 
-  EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType());
+  EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, read_dispatchers[0]->GetType());
   dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get());
   read_dispatchers.clear();
 
@@ -1295,7 +1295,7 @@
   ASSERT_TRUE(read_dispatchers[0]);
   EXPECT_TRUE(read_dispatchers[0]->HasOneRef());
 
-  EXPECT_EQ(Dispatcher::kTypeMessagePipe, read_dispatchers[0]->GetType());
+  EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, read_dispatchers[0]->GetType());
   dispatcher = static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get());
   read_dispatchers.clear();
 
diff --git a/mojo/edk/system/shared_buffer_dispatcher.cc b/mojo/edk/system/shared_buffer_dispatcher.cc
index db823d5..653c507 100644
--- a/mojo/edk/system/shared_buffer_dispatcher.cc
+++ b/mojo/edk/system/shared_buffer_dispatcher.cc
@@ -82,7 +82,7 @@
 }
 
 Dispatcher::Type SharedBufferDispatcher::GetType() const {
-  return kTypeSharedBuffer;
+  return Type::SHARED_BUFFER;
 }
 
 // static
diff --git a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
index 29dcb57..42446c5 100644
--- a/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
+++ b/mojo/edk/system/shared_buffer_dispatcher_unittest.cc
@@ -119,7 +119,7 @@
                                 SharedBufferDispatcher::kDefaultCreateOptions,
                                 100, &dispatcher));
   ASSERT_TRUE(dispatcher);
-  EXPECT_EQ(Dispatcher::kTypeSharedBuffer, dispatcher->GetType());
+  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher->GetType());
 
   // Make a couple of mappings.
   scoped_ptr<embedder::PlatformSharedBufferMapping> mapping1;
@@ -166,7 +166,7 @@
   EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
                                 NullUserPointer(), &dispatcher2));
   ASSERT_TRUE(dispatcher2);
-  EXPECT_EQ(Dispatcher::kTypeSharedBuffer, dispatcher2->GetType());
+  EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType());
 
   EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->Close());
 
@@ -194,7 +194,7 @@
     EXPECT_EQ(MOJO_RESULT_OK, dispatcher1->DuplicateBufferHandle(
                                   MakeUserPointer(&options[i]), &dispatcher2));
     ASSERT_TRUE(dispatcher2);
-    EXPECT_EQ(Dispatcher::kTypeSharedBuffer, dispatcher2->GetType());
+    EXPECT_EQ(Dispatcher::Type::SHARED_BUFFER, dispatcher2->GetType());
     EXPECT_EQ(MOJO_RESULT_OK, dispatcher2->Close());
   }
 
diff --git a/mojo/edk/system/simple_dispatcher_unittest.cc b/mojo/edk/system/simple_dispatcher_unittest.cc
index b8e57e9..58f1458 100644
--- a/mojo/edk/system/simple_dispatcher_unittest.cc
+++ b/mojo/edk/system/simple_dispatcher_unittest.cc
@@ -60,7 +60,7 @@
     HandleSignalsStateChangedNoLock();
   }
 
-  Type GetType() const override { return kTypeUnknown; }
+  Type GetType() const override { return Type::UNKNOWN; }
 
  private:
   friend class base::RefCountedThreadSafe<MockSimpleDispatcher>;
diff --git a/mojo/edk/system/transport_data.cc b/mojo/edk/system/transport_data.cc
index 24b49ec..783a51d 100644
--- a/mojo/edk/system/transport_data.cc
+++ b/mojo/edk/system/transport_data.cc
@@ -137,8 +137,8 @@
   for (size_t i = 0; i < num_handles; i++) {
     Dispatcher* dispatcher = (*dispatchers)[i].get();
     if (!dispatcher) {
-      static_assert(Dispatcher::kTypeUnknown == 0,
-                    "Value of Dispatcher::kTypeUnknown must be 0");
+      static_assert(static_cast<int32_t>(Dispatcher::Type::UNKNOWN) == 0,
+                    "Value of Dispatcher::Type::UNKNOWN must be 0");
       continue;
     }
 
@@ -166,7 +166,7 @@
 #endif
     } else {
       // Nothing to do on failure, since |buffer_| was cleared, and
-      // |kTypeUnknown| is zero. The handle was simply closed.
+      // |Type::UNKNOWN| is zero. The handle was simply closed.
       LOG(ERROR) << "Failed to serialize handle to remote message pipe";
     }
 
diff --git a/mojo/edk/system/transport_data.h b/mojo/edk/system/transport_data.h
index 9911b11..7cb25d3 100644
--- a/mojo/edk/system/transport_data.h
+++ b/mojo/edk/system/transport_data.h
@@ -162,7 +162,8 @@
   };
 
   struct HandleTableEntry {
-    int32_t type;     // From |Dispatcher::Type| (|kTypeUnknown| for "invalid").
+    // TODO(vtl): Should I make |Dispatcher::Type| an |int32_t| enum class?
+    int32_t type;     // From |Dispatcher::Type| (|UNKNOWN| for "invalid").
     uint32_t offset;  // Relative to the start of the "secondary buffer".
     uint32_t size;    // (Not including any padding.)
     uint32_t unused;
