diff --git a/engines/mysql.inc b/engines/mysql.inc
index f1beaaf..8071444 100644
--- a/engines/mysql.inc
+++ b/engines/mysql.inc
@@ -28,6 +28,18 @@ class SchemaDatabaseSchema_mysql extends DatabaseSchema_mysql {
     return $map;
   }
 
+  /**
+   * Overrides DatabaseSchema_mysql::getFieldTypeMap().
+   */
+  public function getFieldTypeMap() {
+    static $map;
+    if (!isset($map)) {
+      $map = parent::getFieldTypeMap();
+      drupal_alter('schema_field_type_map', $map, $this, $this->connection);
+    }
+    return $map;
+  }
+
   public function inspect($connection = NULL, $table_name = NULL) {
     // Support the deprecated connection parameter.
     if (isset($connection) && $connection != $this->connection->getKey()) {
diff --git a/engines/pgsql.inc b/engines/pgsql.inc
index 06eb374..9e42707 100644
--- a/engines/pgsql.inc
+++ b/engines/pgsql.inc
@@ -30,6 +30,18 @@ class SchemaDatabaseSchema_pgsql extends DatabaseSchema_pgsql {
     return $map;
   }
 
+  /**
+   * Overrides DatabaseSchema_pgsql::getFieldTypeMap().
+   */
+  public function getFieldTypeMap() {
+    static $map;
+    if (!isset($map)) {
+      $map = parent::getFieldTypeMap();
+      drupal_alter('schema_field_type_map', $map, $this, $this->connection);
+    }
+    return $map;
+  }
+
   public function inspect($connection = NULL, $table_name = NULL) {
     // Support the deprecated connection parameter.
     if (isset($connection) && $connection != $this->connection->getKey()) {
diff --git a/schema.api.php b/schema.api.php
new file mode 100644
index 0000000..cf601ed
--- /dev/null
+++ b/schema.api.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * API integration for the Schema module.
+ */
+
+/**
+ * Alter the results from the getFieldTypeMap() methods in the schema class.
+ *
+ * @param array $map
+ *   The array mapping of Drupal schema field names to DB-native field types.
+ * @param DatabaseSchema $schema
+ *   The database schema class.
+ * @param DatabaseConnection $connection
+ *   The database connection class since the $schema object doesn't offer
+ *   $schema->connection as a public property.
+ */
+function hook_schema_field_type_map_alter(array &$map, DatabaseSchema $schema, DatabaseConnection $connection) {
+  switch ($connection->getType()) {
+    case 'mysql':
+      $map['datetime:normal'] = 'DATETIME';
+      break;
+    case 'pgsql':
+      $map['datetime:normal'] = 'timestamp without time zone';
+      break;
+    case 'sqlite':
+      $map['datetime:normal'] = 'VARCHAR';
+      break;
+  }
+}
diff --git a/schema.module b/schema.module
index a9fe6ad..74fa3c4 100755
--- a/schema.module
+++ b/schema.module
@@ -609,3 +609,39 @@ function schema_compare_table($ref, $inspect = NULL) {
   $status = (count($reasons) ? 'different' : 'same');
   return array('status' => $status, 'reasons' => $reasons, 'notes' => $notes);
 }
+
+/**
+ * Implements hook_schema_field_type_map_alter() on behalf of field.module.
+ */
+function field_schema_field_type_map_alter(array &$map, DatabaseSchema $schema, DatabaseConnection $connection) {
+  // Get our parent class mapping first.
+  $db_type = $connection->databaseType() . '_type';
+
+  // Load all table schema fields. This has the effect of
+  //  loading in any 3rd-party module field_schemas.
+  $include_additional = array(
+    'include_deleted' => TRUE,
+    'include_inactive' => TRUE
+  );
+  $fields = field_read_fields(array(), $include_additional);
+
+  foreach ($fields as $field) {
+    $cols = $field['columns'];
+
+    // Loop through each column and add any missing mappings.
+    foreach ($cols as $col) {
+      // Schema API says "type" is a required field - bail if it's missing.
+      if (!isset($col['type'])) {
+        continue;
+      }
+      $type = $col['type'];
+      $size = (isset($col['size']) ? $col['size'] : 'normal');
+      $generic_type = $type . ':' . $size;
+      if (!isset($map[$generic_type])) {
+        // Use engine specific type if it exists.
+        $map[$generic_type] = isset($col[$db_type]) ? $col[$db_type] : $type;
+        $map[$generic_type] = drupal_strtoupper($map[$generic_type]);
+      }
+    }
+  }
+}
