diff --git a/core/modules/simpletest/simpletest.install b/core/modules/simpletest/simpletest.install
index c1422e6..524ceff 100644
--- a/core/modules/simpletest/simpletest.install
+++ b/core/modules/simpletest/simpletest.install
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Component\Utility\Environment;
+use Drupal\Core\Database\Database;
 
 /**
  * Minimum value of PHP memory_limit for SimpleTest.
@@ -94,10 +95,8 @@ function simpletest_schema() {
         'description' => 'Test ID, messages belonging to the same ID are reported together',
       ),
       'test_class' => array(
-        'type' => 'varchar_ascii',
-        'length' => 255,
+        'type' => 'text',
         'not null' => TRUE,
-        'default' => '',
         'description' => 'The name of the class that created this message.',
       ),
       'status' => array(
@@ -120,10 +119,8 @@ function simpletest_schema() {
         'description' => 'The message group this message belongs to. For example: warning, browser, user.',
       ),
       'function' => array(
-        'type' => 'varchar_ascii',
-        'length' => 255,
+        'type' => 'text',
         'not null' => TRUE,
-        'default' => '',
         'description' => 'Name of the assertion function or method that created this message.',
       ),
       'line' => array(
@@ -142,7 +139,7 @@ function simpletest_schema() {
     ),
     'primary key' => array('message_id'),
     'indexes' => array(
-      'reporter' => array('test_class', 'message_id'),
+      'reporter' => array(array('test_class', 255), 'message_id'),
     ),
   );
   $schema['simpletest_test_id'] = array(
@@ -180,3 +177,93 @@ function simpletest_uninstall() {
   // Delete verbose test output and any other testing framework files.
   file_unmanaged_delete_recursive('public://simpletest');
 }
+
+/**
+ * Implements hook_update_N()
+ * Changing type to 'text'.
+ * Removing the default value.
+ */
+function simpletest_update_8102() {
+  $simpletest_test_class = array(
+    'type' => 'text',
+    'not null' => TRUE,
+    'description' => 'The name of the class that created this message.',
+  );
+  $schema = Database::getConnection()->schema();
+  // Index 'reporter' uses 'test_class', so remove and recreate it.
+  $schema->dropIndex('simpletest', 'reporter');
+  $schema->changeField('simpletest', 'test_class', 'test_class', $simpletest_test_class);
+  // Spec of the table once we've done the two previous operations. We need
+  // this to recreate the index.
+  $spec = array(
+    'description' => 'Stores simpletest messages',
+    'fields' => array(
+      'message_id'  => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique simpletest message ID.',
+      ),
+      'test_id' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Test ID, messages belonging to the same ID are reported together',
+      ),
+      'test_class' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'The name of the class that created this message.',
+      ),
+      'status' => array(
+        'type' => 'varchar',
+        'length' => 9,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Message status. Core understands pass, fail, exception.',
+      ),
+      'message' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'description' => 'The message itself.',
+      ),
+      'message_group' => array(
+        'type' => 'varchar_ascii',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The message group this message belongs to. For example: warning, browser, user.',
+      ),
+      'function' => array(
+        'type' => 'varchar_ascii',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the assertion function or method that created this message.',
+      ),
+      'line' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Line number on which the function is called.',
+      ),
+      'file' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Name of the file where the function is called.',
+      ),
+    ),
+    'primary key' => array('message_id'),
+  );
+  $schema->addIndex('simpletest', 'reporter', array(array('test_class', 255), 'message_id'), $spec);
+  
+  $simpletest_function = array(
+    'type' => 'text',
+    'not null' => TRUE,
+    'description' => 'Name of the assertion function or method that created this message.',
+  );
+  $schema = Database::getConnection()->schema();
+  $schema->changeField('simpletest', 'function', 'function', $simpletest_function);
+}
+
diff --git a/core/modules/simpletest/src/Tests/Update/UpdateSimpletestTableSchemaTest.php b/core/modules/simpletest/src/Tests/Update/UpdateSimpletestTableSchemaTest.php
new file mode 100644
index 0000000..053d054
--- /dev/null
+++ b/core/modules/simpletest/src/Tests/Update/UpdateSimpletestTableSchemaTest.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Drupal\simpletest\Tests\Update;
+
+use Drupal\system\Tests\Update\UpdatePathTestBase;
+
+/**
+ * Tests the update path base class.
+ *
+ * @group simpletest
+ * @group Update
+ */
+class UpdateSimpletestTableSchemaTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
+      __DIR__ . '/../../../tests/fixtures/update/simpletest_emulate_old_schema.php',
+    ];
+  }
+
+  /**
+   * Test that our table update ran against our simulated table.
+   *
+   * @todo How does one test that the database matches the schema in a
+   *   database-neutral manner?
+   */
+  public function testUpdateHookN() {
+    $this->assertEqual(8100, drupal_get_installed_schema_version('simpletest', TRUE));
+    $this->runUpdates();
+    $this->assertEqual(8102, drupal_get_installed_schema_version('simpletest', TRUE));
+  }
+
+}
diff --git a/core/modules/simpletest/tests/fixtures/update/simpletest_emulate_old_schema.php b/core/modules/simpletest/tests/fixtures/update/simpletest_emulate_old_schema.php
new file mode 100644
index 0000000..41c7dfe
--- /dev/null
+++ b/core/modules/simpletest/tests/fixtures/update/simpletest_emulate_old_schema.php
@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * @file
+ * Partial database to emulate the base 8100 version of the simpletest table.
+ */
+
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+// The 8100 version of the 'simpletest' table.
+$schema = array(
+  'description' => 'Stores simpletest messages',
+  'fields' => array(
+    'message_id'  => array(
+      'type' => 'serial',
+      'not null' => TRUE,
+      'description' => 'Primary Key: Unique simpletest message ID.',
+    ),
+    'test_id' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'description' => 'Test ID, messages belonging to the same ID are reported together',
+    ),
+    'test_class' => array(
+      'type' => 'varchar_ascii',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+      'description' => 'The name of the class that created this message.',
+    ),
+    'status' => array(
+      'type' => 'varchar',
+      'length' => 9,
+      'not null' => TRUE,
+      'default' => '',
+      'description' => 'Message status. Core understands pass, fail, exception.',
+    ),
+    'message' => array(
+      'type' => 'text',
+      'not null' => TRUE,
+      'description' => 'The message itself.',
+    ),
+    'message_group' => array(
+      'type' => 'varchar_ascii',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+      'description' => 'The message group this message belongs to. For example: warning, browser, user.',
+    ),
+    'function' => array(
+      'type' => 'varchar_ascii',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+      'description' => 'Name of the assertion function or method that created this message.',
+    ),
+    'line' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'default' => 0,
+      'description' => 'Line number on which the function is called.',
+    ),
+    'file' => array(
+      'type' => 'varchar',
+      'length' => 255,
+      'not null' => TRUE,
+      'default' => '',
+      'description' => 'Name of the file where the function is called.',
+    ),
+  ),
+  'primary key' => array('message_id'),
+  'indexes' => array(
+    'reporter' => array('test_class', 'message_id'),
+  ),
+);
+
+// Create the table.
+$connection->schema()->createTable('simpletest', $schema);
+
+// Set the schema version.
+$connection->merge('key_value')
+  ->condition('collection', 'system.schema')
+  ->condition('name', 'simpletest')
+  ->fields([
+    'collection' => 'system.schema',
+    'name' => 'simpletest',
+    'value' => 'i:8100;',
+  ])
+  ->execute();
+
+// Update core.extension.
+$extensions = $connection->select('config')
+  ->fields('config', ['data'])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute()
+  ->fetchField();
+$extensions = unserialize($extensions);
+$extensions['module']['simpletest'] = 8100;
+$connection->update('config')
+  ->fields([
+    'data' => serialize($extensions),
+  ])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute();
