diff --git a/core/lib/Drupal/Core/Database/DatabaseException.php b/core/lib/Drupal/Core/Database/DatabaseException.php
index a9470b9..341b648 100644
--- a/core/lib/Drupal/Core/Database/DatabaseException.php
+++ b/core/lib/Drupal/Core/Database/DatabaseException.php
@@ -1,4 +1,5 @@
 <?php
+// @codingStandardsIgnoreFile
 
 namespace Drupal\Core\Database;
 
@@ -9,5 +10,8 @@
  * caught collectively.  Note that this applies only to Drupal-spawned
  * exceptions.  PDOException will not implement this interface and module
  * developers should account for it separately.
+ *
+ * @deprecated in Drupal 8.4.x for removal before Drupal 9.0.0. Use
+ * Drupal\Core\Database\DatabaseExceptionInterface instead.
  */
-interface DatabaseException { }
+interface DatabaseException {}
diff --git a/core/lib/Drupal/Core/Database/DatabaseExceptionInterface.php b/core/lib/Drupal/Core/Database/DatabaseExceptionInterface.php
new file mode 100644
index 0000000..93190f6
--- /dev/null
+++ b/core/lib/Drupal/Core/Database/DatabaseExceptionInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Drupal\Core\Database;
+
+/**
+ * Interface for a database exception.
+ *
+ * All Database exceptions should implement this interface so that they can be
+ * caught collectively.  Note that this applies only to Drupal-spawned
+ * exceptions.  PDOException will not implement this interface and module
+ * developers should account for it separately.
+ *
+ * Note that this interface extends DatabaseException. This is for
+ * backwards-compatibility since DatabaseException is deprecated.
+ * DatabaseException will be removed at some point, and this interface will no
+ * longer extend it.
+ */
+interface DatabaseExceptionInterface extends DatabaseException {}
diff --git a/core/lib/Drupal/Core/Database/DatabaseExceptionWrapper.php b/core/lib/Drupal/Core/Database/DatabaseExceptionWrapper.php
index 0b6f338..a6c4f61 100644
--- a/core/lib/Drupal/Core/Database/DatabaseExceptionWrapper.php
+++ b/core/lib/Drupal/Core/Database/DatabaseExceptionWrapper.php
@@ -7,6 +7,6 @@
  *
  * This class will always wrap a PDOException.
  */
-class DatabaseExceptionWrapper extends \RuntimeException implements DatabaseException {
+class DatabaseExceptionWrapper extends \RuntimeException implements DatabaseExceptionInterface {
 
 }
diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
index 164f68a..c1f69a4 100644
--- a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
+++ b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php
@@ -8,7 +8,7 @@
 use Drupal\Core\Database\Database;
 use Drupal\Core\Database\DatabaseNotFoundException;
 use Drupal\Core\Database\TransactionCommitFailedException;
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 use Drupal\Core\Database\Connection as DatabaseConnection;
 use Drupal\Component\Utility\Unicode;
 
@@ -86,7 +86,7 @@ public function query($query, array $args = [], $options = []) {
     try {
       return parent::query($query, $args, $options);
     }
-    catch (DatabaseException $e) {
+    catch (DatabaseExceptionInterface $e) {
       if ($e->getPrevious()->errorInfo[1] == 1153) {
         // If a max_allowed_packet error occurs the message length is truncated.
         // This should prevent the error from recurring if the exception is
@@ -295,7 +295,7 @@ public function nextIdDelete() {
     // errors. There is no problem with completely ignoring errors here: if
     // these queries fail, the sequence will work just fine, just use a bit
     // more database storage and memory.
-    catch (DatabaseException $e) {
+    catch (DatabaseExceptionInterface $e) {
     }
   }
 
diff --git a/core/lib/Drupal/Core/Database/IntegrityConstraintViolationException.php b/core/lib/Drupal/Core/Database/IntegrityConstraintViolationException.php
index 753010e..9340232 100644
--- a/core/lib/Drupal/Core/Database/IntegrityConstraintViolationException.php
+++ b/core/lib/Drupal/Core/Database/IntegrityConstraintViolationException.php
@@ -8,4 +8,4 @@
  * This exception is thrown e.g. when trying to insert a row that would violate
  * a unique key constraint.
  */
-class IntegrityConstraintViolationException extends \RuntimeException implements DatabaseException { }
+class IntegrityConstraintViolationException extends \RuntimeException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/InvalidQueryException.php b/core/lib/Drupal/Core/Database/InvalidQueryException.php
index e669d79..46bdd53 100644
--- a/core/lib/Drupal/Core/Database/InvalidQueryException.php
+++ b/core/lib/Drupal/Core/Database/InvalidQueryException.php
@@ -8,4 +8,4 @@
  * This exception is thrown e.g. when trying to have an IN condition with an
  * empty array.
  */
-class InvalidQueryException extends \InvalidArgumentException implements DatabaseException { }
+class InvalidQueryException extends \InvalidArgumentException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/Query/FieldsOverlapException.php b/core/lib/Drupal/Core/Database/Query/FieldsOverlapException.php
index c75f46a..a8f5341 100644
--- a/core/lib/Drupal/Core/Database/Query/FieldsOverlapException.php
+++ b/core/lib/Drupal/Core/Database/Query/FieldsOverlapException.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\Core\Database\Query;
 
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 
 /**
  * Exception thrown if an insert query specifies a field twice.
@@ -10,4 +10,4 @@
  * It is not allowed to specify a field as default and insert field, this
  * exception is thrown if that is the case.
  */
-class FieldsOverlapException extends \InvalidArgumentException implements DatabaseException {}
+class FieldsOverlapException extends \InvalidArgumentException implements DatabaseExceptionInterface {}
diff --git a/core/lib/Drupal/Core/Database/Query/InvalidMergeQueryException.php b/core/lib/Drupal/Core/Database/Query/InvalidMergeQueryException.php
index 6054854..9d4ece2 100644
--- a/core/lib/Drupal/Core/Database/Query/InvalidMergeQueryException.php
+++ b/core/lib/Drupal/Core/Database/Query/InvalidMergeQueryException.php
@@ -2,7 +2,7 @@
 
 namespace Drupal\Core\Database\Query;
 
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 
 /**
  * Exception thrown for merge queries that do not make semantic sense.
@@ -10,4 +10,4 @@
  * There are many ways that a merge query could be malformed.  They should all
  * throw this exception and set an appropriately descriptive message.
  */
-class InvalidMergeQueryException extends \InvalidArgumentException implements DatabaseException {}
+class InvalidMergeQueryException extends \InvalidArgumentException implements DatabaseExceptionInterface {}
diff --git a/core/lib/Drupal/Core/Database/Query/NoFieldsException.php b/core/lib/Drupal/Core/Database/Query/NoFieldsException.php
index 31b6566..336a220 100644
--- a/core/lib/Drupal/Core/Database/Query/NoFieldsException.php
+++ b/core/lib/Drupal/Core/Database/Query/NoFieldsException.php
@@ -2,9 +2,9 @@
 
 namespace Drupal\Core\Database\Query;
 
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 
 /**
  * Exception thrown if an insert query doesn't specify insert or default fields.
  */
-class NoFieldsException extends \InvalidArgumentException implements DatabaseException {}
+class NoFieldsException extends \InvalidArgumentException implements DatabaseExceptionInterface {}
diff --git a/core/lib/Drupal/Core/Database/Query/NoUniqueFieldException.php b/core/lib/Drupal/Core/Database/Query/NoUniqueFieldException.php
index be0059d..3d9c375 100644
--- a/core/lib/Drupal/Core/Database/Query/NoUniqueFieldException.php
+++ b/core/lib/Drupal/Core/Database/Query/NoUniqueFieldException.php
@@ -2,9 +2,9 @@
 
 namespace Drupal\Core\Database\Query;
 
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 
 /**
  * Exception thrown if an upsert query doesn't specify a unique field.
  */
-class NoUniqueFieldException extends \InvalidArgumentException implements DatabaseException {}
+class NoUniqueFieldException extends \InvalidArgumentException implements DatabaseExceptionInterface {}
diff --git a/core/lib/Drupal/Core/Database/RowCountException.php b/core/lib/Drupal/Core/Database/RowCountException.php
index daf1940..5d9ab2f 100644
--- a/core/lib/Drupal/Core/Database/RowCountException.php
+++ b/core/lib/Drupal/Core/Database/RowCountException.php
@@ -5,7 +5,7 @@
 /**
  * Exception thrown if a SELECT query trying to execute rowCount() on result.
  */
-class RowCountException extends \RuntimeException implements DatabaseException {
+class RowCountException extends \RuntimeException implements DatabaseExceptionInterface {
 
   public function __construct($message = NULL, $code = 0, \Exception $previous = NULL) {
     if (!isset($message)) {
diff --git a/core/lib/Drupal/Core/Database/SchemaException.php b/core/lib/Drupal/Core/Database/SchemaException.php
index 1106a6a..a8f94cf 100644
--- a/core/lib/Drupal/Core/Database/SchemaException.php
+++ b/core/lib/Drupal/Core/Database/SchemaException.php
@@ -5,4 +5,4 @@
 /**
  * Base exception for Schema-related errors.
  */
-class SchemaException extends \RuntimeException implements DatabaseException { }
+class SchemaException extends \RuntimeException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/SchemaObjectDoesNotExistException.php b/core/lib/Drupal/Core/Database/SchemaObjectDoesNotExistException.php
index b2af584..0d59a91 100644
--- a/core/lib/Drupal/Core/Database/SchemaObjectDoesNotExistException.php
+++ b/core/lib/Drupal/Core/Database/SchemaObjectDoesNotExistException.php
@@ -9,4 +9,4 @@
  * modify a database table, field, or index that does not currently exist in
  * the database schema.
  */
-class SchemaObjectDoesNotExistException extends SchemaException implements DatabaseException { }
+class SchemaObjectDoesNotExistException extends SchemaException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/SchemaObjectExistsException.php b/core/lib/Drupal/Core/Database/SchemaObjectExistsException.php
index 3390b17..f6a6d2e 100644
--- a/core/lib/Drupal/Core/Database/SchemaObjectExistsException.php
+++ b/core/lib/Drupal/Core/Database/SchemaObjectExistsException.php
@@ -9,4 +9,4 @@
  * create a new database table, field, or index that already exists in the
  * database schema.
  */
-class SchemaObjectExistsException extends SchemaException implements DatabaseException { }
+class SchemaObjectExistsException extends SchemaException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/TransactionCommitFailedException.php b/core/lib/Drupal/Core/Database/TransactionCommitFailedException.php
index 9f7526f..c95b208 100644
--- a/core/lib/Drupal/Core/Database/TransactionCommitFailedException.php
+++ b/core/lib/Drupal/Core/Database/TransactionCommitFailedException.php
@@ -5,4 +5,4 @@
 /**
  * Exception thrown when a commit() function fails.
  */
-class TransactionCommitFailedException extends TransactionException implements DatabaseException { }
+class TransactionCommitFailedException extends TransactionException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/TransactionException.php b/core/lib/Drupal/Core/Database/TransactionException.php
index 3b35a31..e4ad7d6 100644
--- a/core/lib/Drupal/Core/Database/TransactionException.php
+++ b/core/lib/Drupal/Core/Database/TransactionException.php
@@ -5,4 +5,4 @@
 /**
  * Exception thrown by an error in a database transaction.
  */
-class TransactionException extends \RuntimeException implements DatabaseException { }
+class TransactionException extends \RuntimeException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/TransactionExplicitCommitNotAllowedException.php b/core/lib/Drupal/Core/Database/TransactionExplicitCommitNotAllowedException.php
index 1b4710e..630e531 100644
--- a/core/lib/Drupal/Core/Database/TransactionExplicitCommitNotAllowedException.php
+++ b/core/lib/Drupal/Core/Database/TransactionExplicitCommitNotAllowedException.php
@@ -8,4 +8,4 @@
  * This exception will be thrown when the PDO connection commit() is called.
  * Code should never call this method directly.
  */
-class TransactionExplicitCommitNotAllowedException extends TransactionException implements DatabaseException { }
+class TransactionExplicitCommitNotAllowedException extends TransactionException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/TransactionNameNonUniqueException.php b/core/lib/Drupal/Core/Database/TransactionNameNonUniqueException.php
index dbbfc06..0ed6e90 100644
--- a/core/lib/Drupal/Core/Database/TransactionNameNonUniqueException.php
+++ b/core/lib/Drupal/Core/Database/TransactionNameNonUniqueException.php
@@ -5,4 +5,4 @@
 /**
  * Exception thrown when a savepoint or transaction name occurs twice.
  */
-class TransactionNameNonUniqueException extends TransactionException implements DatabaseException { }
+class TransactionNameNonUniqueException extends TransactionException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/TransactionNoActiveException.php b/core/lib/Drupal/Core/Database/TransactionNoActiveException.php
index 883ce97..d3ebf31 100644
--- a/core/lib/Drupal/Core/Database/TransactionNoActiveException.php
+++ b/core/lib/Drupal/Core/Database/TransactionNoActiveException.php
@@ -5,4 +5,4 @@
 /**
  * Exception for when popTransaction() is called with no active transaction.
  */
-class TransactionNoActiveException extends TransactionException implements DatabaseException { }
+class TransactionNoActiveException extends TransactionException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Database/TransactionOutOfOrderException.php b/core/lib/Drupal/Core/Database/TransactionOutOfOrderException.php
index 7084eda..29a89fd 100644
--- a/core/lib/Drupal/Core/Database/TransactionOutOfOrderException.php
+++ b/core/lib/Drupal/Core/Database/TransactionOutOfOrderException.php
@@ -5,4 +5,4 @@
 /**
  * Exception thrown when a rollBack() resulted in other active transactions being rolled-back.
  */
-class TransactionOutOfOrderException extends TransactionException implements DatabaseException { }
+class TransactionOutOfOrderException extends TransactionException implements DatabaseExceptionInterface { }
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
index f9dd0c0..94fb2b0 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
@@ -3,7 +3,7 @@
 namespace Drupal\Core\Entity\Sql;
 
 use Drupal\Core\Database\Connection;
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
 use Drupal\Core\Entity\ContentEntityTypeInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
@@ -419,7 +419,7 @@ public function onFieldStorageDefinitionDelete(FieldStorageDefinitionInterface $
         throw new FieldStorageDefinitionUpdateForbiddenException('Unable to delete a field (' . $storage_definition->getName() . ' in ' . $storage_definition->getTargetEntityTypeId() . ' entity) with data that cannot be purged.');
       }
     }
-    catch (DatabaseException $e) {
+    catch (DatabaseExceptionInterface $e) {
       // This may happen when changing field storage schema, since we are not
       // able to use a table mapping matching the passed storage definition.
       // @todo Revisit this once we are able to instantiate the table mapping
diff --git a/core/modules/dblog/src/Logger/DbLog.php b/core/modules/dblog/src/Logger/DbLog.php
index 97b0b7b..8afc420 100644
--- a/core/modules/dblog/src/Logger/DbLog.php
+++ b/core/modules/dblog/src/Logger/DbLog.php
@@ -5,7 +5,7 @@
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Database\Connection;
 use Drupal\Core\Database\Database;
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
 use Drupal\Core\Logger\LogMessageParserInterface;
 use Drupal\Core\Logger\RfcLoggerTrait;
@@ -91,7 +91,7 @@ public function log($level, $message, array $context = []) {
       // connection and write again.
       if (
         // Only handle database related exceptions.
-        ($e instanceof DatabaseException || $e instanceof \PDOException) &&
+        ($e instanceof DatabaseExceptionInterface || $e instanceof \PDOException) &&
         // Avoid an endless loop of re-write attempts.
         $this->connection->getTarget() != self::DEDICATED_DBLOG_CONNECTION_TARGET
       ) {
diff --git a/core/phpcs.xml.dist b/core/phpcs.xml.dist
index be8c46e..6b0a830 100644
--- a/core/phpcs.xml.dist
+++ b/core/phpcs.xml.dist
@@ -15,6 +15,7 @@
   <rule ref="Drupal.Classes.ClassCreateInstance"/>
   <rule ref="Drupal.Classes.ClassDeclaration"/>
   <rule ref="Drupal.Classes.FullyQualifiedNamespace"/>
+  <rule ref="Drupal.Classes.InterfaceName"/>
   <rule ref="Drupal.Classes.UnusedUseStatement"/>
   <rule ref="Drupal.CSS.ClassDefinitionNameSpacing"/>
   <rule ref="Drupal.CSS.ColourDefinition"/>
diff --git a/core/tests/Drupal/KernelTests/Core/Database/LargeQueryTest.php b/core/tests/Drupal/KernelTests/Core/Database/LargeQueryTest.php
index a93d1fc..0b59c58 100644
--- a/core/tests/Drupal/KernelTests/Core/Database/LargeQueryTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Database/LargeQueryTest.php
@@ -4,7 +4,7 @@
 
 use Drupal\Component\Utility\Environment;
 use Drupal\Core\Database\Database;
-use Drupal\Core\Database\DatabaseException;
+use Drupal\Core\Database\DatabaseExceptionInterface;
 
 /**
  * Tests handling of large queries.
@@ -32,7 +32,7 @@ public function testMaxAllowedPacketQueryTruncating() {
           db_query('SELECT name FROM {test} WHERE name = :name', [':name' => $long_name]);
           $this->fail("An exception should be thrown for queries larger than 'max_allowed_packet'");
         }
-        catch (DatabaseException $e) {
+        catch (DatabaseExceptionInterface $e) {
           // Close and re-open the connection. Otherwise we will run into error
           // 2006 "MySQL server had gone away" afterwards.
           Database::closeConnection();
diff --git a/core/tests/Drupal/Tests/Component/Utility/ArgumentsResolverTest.php b/core/tests/Drupal/Tests/Component/Utility/ArgumentsResolverTest.php
index 1710609..867e3b3 100644
--- a/core/tests/Drupal/Tests/Component/Utility/ArgumentsResolverTest.php
+++ b/core/tests/Drupal/Tests/Component/Utility/ArgumentsResolverTest.php
@@ -96,9 +96,9 @@ public function testGetWildcardArgument() {
    * Tests getArgument() with a Route, Request, and Account object.
    */
   public function testGetArgumentOrder() {
-    $a1 = $this->getMock('\Drupal\Tests\Component\Utility\TestInterface1');
+    $a1 = $this->getMock('\Drupal\Tests\Component\Utility\Test1Interface');
     $a2 = $this->getMock('\Drupal\Tests\Component\Utility\TestClass');
-    $a3 = $this->getMock('\Drupal\Tests\Component\Utility\TestInterface2');
+    $a3 = $this->getMock('\Drupal\Tests\Component\Utility\Test2Interface');
 
     $objects = [
       't1' => $a1,
@@ -107,12 +107,12 @@ public function testGetArgumentOrder() {
     $wildcards = [$a3];
     $resolver = new ArgumentsResolver([], $objects, $wildcards);
 
-    $callable = function(TestInterface1 $t1, TestClass $tc, TestInterface2 $t2) {};
+    $callable = function(Test1Interface $t1, TestClass $tc, Test2Interface $t2) {};
     $arguments = $resolver->getArguments($callable);
     $this->assertSame([$a1, $a2, $a3], $arguments);
 
     // Test again, but with the arguments in a different order.
-    $callable = function(TestInterface2 $t2, TestClass $tc, TestInterface1 $t1) {};
+    $callable = function(Test2Interface $t2, TestClass $tc, Test1Interface $t1) {};
     $arguments = $resolver->getArguments($callable);
     $this->assertSame([$a3, $a2, $a1], $arguments);
   }
@@ -123,7 +123,7 @@ public function testGetArgumentOrder() {
    * Without the typehint, the wildcard object will not be passed to the callable.
    */
   public function testGetWildcardArgumentNoTypehint() {
-    $a = $this->getMock('\Drupal\Tests\Component\Utility\TestInterface1');
+    $a = $this->getMock('\Drupal\Tests\Component\Utility\Test1Interface');
     $wildcards = [$a];
     $resolver = new ArgumentsResolver([], [], $wildcards);
 
@@ -196,13 +196,13 @@ public function access($foo) {
 /**
  * Provides a test interface.
  */
-interface TestInterface1 {
+interface Test1Interface {
 }
 
 /**
  * Provides a different test interface.
  */
-interface TestInterface2 {
+interface Test2Interface {
 }
 
 function test_access_arguments_resolver_access($foo) {
