diff --git a/core/modules/views/views.views.inc b/core/modules/views/views.views.inc
index 2efc08c..21fe1b9 100644
--- a/core/modules/views/views.views.inc
+++ b/core/modules/views/views.views.inc
@@ -302,6 +302,7 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
   }
 
   $field_name = $field_storage->getName();
+  $field_type = $field_storage->getType();
   $field_columns = $field_storage->getColumns();
 
   // Grab information about the entity type tables.
@@ -489,28 +490,84 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
   foreach ($field_columns as $column => $attributes) {
     $allow_sort = TRUE;
 
-    // Identify likely filters and arguments for each column based on field type.
-    switch ($attributes['type']) {
-      case 'int':
-      case 'mediumint':
-      case 'tinyint':
-      case 'bigint':
-      case 'serial':
-      case 'numeric':
-      case 'float':
-        $filter = 'numeric';
+    // Set up the sort, argument, and filters, based on
+    // the column and/or field data type.
+    // @todo Allow field types to customize this.
+    // @see https://www.drupal.org/node/2337515
+    switch ($field_type) {
+      // Special case a few field types.
+      case 'timestamp':
+      case 'created':
+      case 'changed':
+        $argument = 'date';
+        $filter = 'date';
+        $sort = 'date';
+        break;
+
+      case 'language':
+        $argument = 'language';
+        $filter = 'language';
+        $sort = 'standard';
+        break;
+
+      case 'boolean':
+        $field = 'field';
         $argument = 'numeric';
+        $filter = 'boolean';
         $sort = 'standard';
         break;
-      case 'text':
+
+      case 'uri':
+        $argument = 'string';
+        $filter = 'string';
+        $sort = 'standard';
+        break;
+
       case 'blob':
+      case 'text':
+      case 'text_with_summary':
         // It does not make sense to sort by blob or text.
         $allow_sort = FALSE;
+        // Treat these three long text fields the same.
+        $field_type = 'text_long';
+        // Intentional fall-through here to the default processing!
+
       default:
-        $filter = 'string';
-        $argument = 'string';
-        $sort = 'standard';
-        break;
+        // For most fields, the field type is generic enough to just use
+        // the column type to determine the filters etc.
+        switch ($attributes['type']) {
+
+          case 'int':
+          case 'integer':
+          case 'smallint':
+          case 'tinyint':
+          case 'mediumint':
+          case 'float':
+          case 'double':
+          case 'decimal':
+            $argument = 'numeric';
+            $filter = 'numeric';
+            $sort = 'standard';
+            break;
+
+          case 'char':
+          case 'string':
+          case 'varchar':
+          case 'varchar_ascii':
+          case 'tinytext':
+          case 'text':
+          case 'mediumtext':
+          case 'longtext':
+            $argument = 'string';
+            $filter = 'string';
+            $sort = 'standard';
+            break;
+
+          default:
+            $argument = 'standard';
+            $filter = 'standard';
+            $sort = 'standard';
+        }
     }
 
     if (count($field_columns) == 1 || $column == 'value') {
