diff --git a/includes/views/handlers/message_handler_filter_message_type.inc b/includes/views/handlers/message_handler_filter_message_type.inc
index 8ea160c..99adb06 100644
--- a/includes/views/handlers/message_handler_filter_message_type.inc
+++ b/includes/views/handlers/message_handler_filter_message_type.inc
@@ -9,7 +9,7 @@ class message_handler_filter_message_type extends views_handler_filter_in_operat
       $this->value_title = t('Message type');
       $options = array();
       foreach (message_type_load() as $name => $message_type) {
-        $options[$name] = check_plain($message_type->description);
+        $options[$name] = check_plain($message_type->label());
       }
       asort($options);
       $this->value_options = $options;
diff --git a/message.module b/message.module
index a25d808..e840afa 100644
--- a/message.module
+++ b/message.module
@@ -98,12 +98,14 @@ function message_entity_info() {
     'bundle of' => 'message',
     'module' => 'message',
     'access callback' => 'message_type_access',
+    'label callback' => 'entity_class_label',
     'entity cache' => module_exists('entitycache'),
     // Enable the entity API's admin UI.
     'admin ui' => array(
       'path' => 'admin/structure/messages',
       'file' => 'includes/message.admin.inc',
       'controller class' => 'MessageTypeUIController',
+      'menu wildcard' => '%message_type',
     ),
   );
 
diff --git a/message_i18n/message_i18n.info b/message_i18n/message_i18n.info
new file mode 100644
index 0000000..42844c7
--- /dev/null
+++ b/message_i18n/message_i18n.info
@@ -0,0 +1,6 @@
+name = Message type translation
+description = Translate message type descriptions.
+dependencies[] = message
+dependencies[] = i18n_string
+package = Multilingual - Internationalization
+core = 7.x
diff --git a/message_i18n/message_i18n.module b/message_i18n/message_i18n.module
new file mode 100644
index 0000000..1ca799a
--- /dev/null
+++ b/message_i18n/message_i18n.module
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * @file
+ * Message i18n integration module via entity API i18n support.
+ *
+ * @see EntityDefaultI18nController
+ */
+
+/**
+ * Implements hook_entity_info_alter().
+ */
+function message_i18n_entity_info_alter(&$info) {
+  // Enable i18n support via the entity API.
+  $info['message_type']['i18n controller class'] = 'EntityDefaultI18nStringController';
+}
+
+/**
+ * Implements hook_entity_property_info_alter().
+ */
+function message_i18n_entity_property_info_alter(&$info) {
+  // Mark some properties as translatable, but also denote that translation
+  // works with i18n_string.
+  foreach (array('description') as $name) {
+    $info['message_type']['properties'][$name]['translatable'] = TRUE;
+    $info['message_type']['properties'][$name]['i18n string'] = TRUE;
+  }
+}
+
+/**
+ * Implements hook_message_type_insert().
+ */
+function message_i18n_message_type_insert($message_type) {
+  i18n_string_object_update('message_type', $message_type);
+}
+
+/**
+ * Implements hook_message_type_update().
+ */
+function message_i18n_message_type_update($message_type) {
+  // Account for name changes.
+  if ($message_type->original->name != $message_type->name) {
+    i18n_string_update_context("message:message_type:{$message_type->original->name}:*", "message:message_type:{$message_type->name}:*");
+  }
+  i18n_string_object_update('message_type', $message_type);
+}
+
+/**
+ * Implements hook_message_type_delete().
+ */
+function message_i18n_message_type_delete($message_type) {
+  i18n_string_object_remove('message_type', $message_type);
+}
