diff --git a/core/modules/comment/migration_templates/d7_comment.yml b/core/modules/comment/migration_templates/d7_comment.yml
index 94a2884..5e609a6 100644
--- a/core/modules/comment/migration_templates/d7_comment.yml
+++ b/core/modules/comment/migration_templates/d7_comment.yml
@@ -16,8 +16,15 @@ process:
     source: pid
   entity_id: nid
   entity_type: 'constants/entity_type'
-  comment_type: comment_type
-  field_name: comment_type
+  comment_type:
+    -
+      plugin: migration_lookup
+      source: comment_type
+      migration: d7_comment_type
+    -
+      plugin: skip_on_empty
+      method: row
+  field_name: '@comment_type'
   subject: subject
   uid: uid
   name: name
diff --git a/core/modules/comment/migration_templates/d7_comment_entity_display.yml b/core/modules/comment/migration_templates/d7_comment_entity_display.yml
index 2004505..3ae948e 100644
--- a/core/modules/comment/migration_templates/d7_comment_entity_display.yml
+++ b/core/modules/comment/migration_templates/d7_comment_entity_display.yml
@@ -13,7 +13,14 @@ source:
       weight: 20
 process:
   entity_type: 'constants/entity_type'
-  field_name: bundle
+  field_name:
+    -
+      plugin: migration_lookup
+      source: bundle
+      migration: d7_comment_type
+    -
+      plugin: skip_on_empty
+      method: row
   view_mode: 'constants/view_mode'
   options: 'constants/options'
   bundle: node_type
diff --git a/core/modules/comment/migration_templates/d7_comment_entity_form_display_subject.yml b/core/modules/comment/migration_templates/d7_comment_entity_form_display_subject.yml
index c27303e..46f231d 100644
--- a/core/modules/comment/migration_templates/d7_comment_entity_form_display_subject.yml
+++ b/core/modules/comment/migration_templates/d7_comment_entity_form_display_subject.yml
@@ -22,7 +22,14 @@ process:
     map:
       0: true
       1: false
-  bundle: bundle
+  bundle:
+    -
+      plugin: migration_lookup
+      source: bundle
+      migration: d7_comment_type
+    -
+      plugin: skip_on_empty
+      method: row
 destination:
   plugin: component_entity_form_display
 migration_dependencies:
diff --git a/core/modules/comment/migration_templates/d7_comment_field.yml b/core/modules/comment/migration_templates/d7_comment_field.yml
index b4b3543..95a4602 100644
--- a/core/modules/comment/migration_templates/d7_comment_field.yml
+++ b/core/modules/comment/migration_templates/d7_comment_field.yml
@@ -9,9 +9,16 @@ source:
     type: comment
 process:
   entity_type: 'constants/entity_type'
-  field_name: bundle
+  field_name:
+    -
+      plugin: migration_lookup
+      source: bundle
+      migration: d7_comment_type
+    -
+      plugin: skip_on_empty
+      method: row
   type: 'constants/type'
-  'settings/comment_type': bundle
+  'settings/comment_type': '@field_name'
 destination:
   plugin: entity:field_storage_config
 migration_dependencies:
diff --git a/core/modules/comment/migration_templates/d7_comment_field_instance.yml b/core/modules/comment/migration_templates/d7_comment_field_instance.yml
index 80a1a51..147efcf 100644
--- a/core/modules/comment/migration_templates/d7_comment_field_instance.yml
+++ b/core/modules/comment/migration_templates/d7_comment_field_instance.yml
@@ -12,7 +12,14 @@ process:
   entity_type: 'constants/entity_type'
   label: 'constants/label'
   required: 'constants/required'
-  field_name: bundle
+  field_name:
+    -
+      plugin: migration_lookup
+      source: bundle
+      migration: d7_comment_type
+    -
+      plugin: skip_on_empty
+      method: row
   bundle: node_type
   'default_value/0/status': 'constants/required'
   'settings/default_mode': default_mode
diff --git a/core/modules/comment/migration_templates/d7_comment_type.yml b/core/modules/comment/migration_templates/d7_comment_type.yml
index 090bfdd..f94a59d 100644
--- a/core/modules/comment/migration_templates/d7_comment_type.yml
+++ b/core/modules/comment/migration_templates/d7_comment_type.yml
@@ -8,7 +8,14 @@ source:
     entity_type: node
 process:
   target_entity_type_id: 'constants/entity_type'
-  id: bundle
+  id:
+    plugin: static_map
+    source: bundle
+    bypass: true
+    # The Forum module provides its own comment type (comment_forum), which we
+    # want to reuse if it exists.
+    map:
+      comment_node_forum: comment_forum
   label: label
 destination:
   plugin: entity:comment_type
diff --git a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityDisplayTest.php b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityDisplayTest.php
index 871765b..8857f57 100644
--- a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityDisplayTest.php
+++ b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityDisplayTest.php
@@ -53,7 +53,7 @@ public function testMigration() {
     $this->assertDisplay('node.article.default', 'comment_node_article');
     $this->assertDisplay('node.book.default', 'comment_node_book');
     $this->assertDisplay('node.blog.default', 'comment_node_blog');
-    $this->assertDisplay('node.forum.default', 'comment_node_forum');
+    $this->assertDisplay('node.forum.default', 'comment_forum');
     $this->assertDisplay('node.test_content_type.default', 'comment_node_test_content_type');
   }
 
diff --git a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityFormDisplaySubjectTest.php b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityFormDisplaySubjectTest.php
index 8ce439a..c713a45 100644
--- a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityFormDisplaySubjectTest.php
+++ b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentEntityFormDisplaySubjectTest.php
@@ -48,7 +48,7 @@ public function testMigration() {
     $this->assertDisplay('comment.comment_node_article.default');
     $this->assertDisplay('comment.comment_node_book.default');
     $this->assertDisplay('comment.comment_node_blog.default');
-    $this->assertDisplay('comment.comment_node_forum.default');
+    $this->assertDisplay('comment.comment_forum.default');
     $this->assertDisplay('comment.comment_node_test_content_type.default');
   }
 
diff --git a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldInstanceTest.php b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldInstanceTest.php
index cc82c82..f7e10d0 100644
--- a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldInstanceTest.php
+++ b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldInstanceTest.php
@@ -79,7 +79,7 @@ public function testMigration() {
     $this->assertEntity('node.article.comment_node_article', 'comment_node_article', 'article', TRUE, 50, FALSE, CommentItemInterface::FORM_BELOW, TRUE);
     $this->assertEntity('node.blog.comment_node_blog', 'comment_node_blog', 'blog', TRUE, 50, FALSE, CommentItemInterface::FORM_BELOW, TRUE);
     $this->assertEntity('node.book.comment_node_book', 'comment_node_book', 'book', TRUE, 50, FALSE, CommentItemInterface::FORM_BELOW, TRUE);
-    $this->assertEntity('node.forum.comment_node_forum', 'comment_node_forum', 'forum', TRUE, 50, FALSE, CommentItemInterface::FORM_BELOW, TRUE);
+    $this->assertEntity('node.forum.comment_forum', 'comment_forum', 'forum', TRUE, 50, FALSE, CommentItemInterface::FORM_BELOW, TRUE);
     $this->assertEntity('node.test_content_type.comment_node_test_content_type', 'comment_node_test_content_type', 'test_content_type', TRUE, 30, FALSE, CommentItemInterface::FORM_BELOW, TRUE);
   }
 
diff --git a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldTest.php b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldTest.php
index b995bdb..6f94df1 100644
--- a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldTest.php
+++ b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentFieldTest.php
@@ -54,7 +54,7 @@ public function testMigration() {
     $this->assertEntity('node.comment_node_article', 'comment_node_article');
     $this->assertEntity('node.comment_node_blog', 'comment_node_blog');
     $this->assertEntity('node.comment_node_book', 'comment_node_book');
-    $this->assertEntity('node.comment_node_forum', 'comment_node_forum');
+    $this->assertEntity('node.comment_forum', 'comment_forum');
     $this->assertEntity('node.comment_node_test_content_type', 'comment_node_test_content_type');
   }
 
diff --git a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentTypeTest.php b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentTypeTest.php
index 60f640d..8d2e576 100644
--- a/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentTypeTest.php
+++ b/core/modules/comment/tests/src/Kernel/Migrate/d7/MigrateCommentTypeTest.php
@@ -51,7 +51,7 @@ public function testMigration() {
     $this->assertEntity('comment_node_article', 'Article comment');
     $this->assertEntity('comment_node_blog', 'Blog entry comment');
     $this->assertEntity('comment_node_book', 'Book page comment');
-    $this->assertEntity('comment_node_forum', 'Forum topic comment');
+    $this->assertEntity('comment_forum', 'Forum topic comment');
     $this->assertEntity('comment_node_test_content_type', 'Test content type comment');
 
     $migration = $this->getMigration('d7_comment_type');
diff --git a/core/modules/field/migration_templates/d7_field_formatter_settings.yml b/core/modules/field/migration_templates/d7_field_formatter_settings.yml
index 2c0196b..9bc27dc 100644
--- a/core/modules/field/migration_templates/d7_field_formatter_settings.yml
+++ b/core/modules/field/migration_templates/d7_field_formatter_settings.yml
@@ -26,7 +26,15 @@ process:
       plugin: skip_on_empty
       method: row
   entity_type: entity_type
-  bundle: bundle
+  # The bundle needs to be statically mapped in order to support comment types
+  # that might already exist before this migration is run. See
+  # d7_comment_type.yml or more information.
+  bundle:
+    plugin: static_map
+    source: bundle
+    bypass: true
+    map:
+      comment_node_forum: comment_forum
   view_mode:
     -
       plugin: migration_lookup
diff --git a/core/modules/field/migration_templates/d7_field_instance.yml b/core/modules/field/migration_templates/d7_field_instance.yml
index e18b273..d50a393 100644
--- a/core/modules/field/migration_templates/d7_field_instance.yml
+++ b/core/modules/field/migration_templates/d7_field_instance.yml
@@ -11,7 +11,15 @@ source:
 process:
   entity_type: entity_type
   field_name: field_name
-  bundle: bundle
+  # The bundle needs to be statically mapped in order to support comment types
+  # that might already exist before this migration is run. See
+  # d7_comment_type.yml for more information.
+  bundle:
+    plugin: static_map
+    source: bundle
+    bypass: true
+    map:
+      comment_node_forum: comment_forum
   label: label
   description: description
   required: required
diff --git a/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml
index 986e02c..68e4798 100644
--- a/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml
+++ b/core/modules/field/migration_templates/d7_field_instance_widget_settings.yml
@@ -26,7 +26,15 @@ process:
     -
       plugin: skip_on_empty
       method: row
-  bundle: bundle
+  # The bundle needs to be statically mapped in order to support comment types
+  # that might already exist before this migration is run. See
+  # d7_comment_type.yml for more information.
+  bundle:
+    plugin: static_map
+    source: bundle
+    bypass: true
+    map:
+      comment_node_forum: comment_forum
   form_mode: 'constants/form_mode'
   field_name: field_name
   entity_type: entity_type
diff --git a/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldFormatterSettingsTest.php b/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldFormatterSettingsTest.php
index dd38569..cec2a6d 100644
--- a/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldFormatterSettingsTest.php
+++ b/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldFormatterSettingsTest.php
@@ -56,7 +56,7 @@ protected function setUp() {
       'label' => $this->randomMachineName(),
     ])->save();
     CommentType::create([
-      'id' => 'comment_node_forum',
+      'id' => 'comment_forum',
       'label' => $this->randomMachineName(),
     ])->save();
     CommentType::create([
@@ -215,8 +215,8 @@ public function testMigration() {
     $this->assertEntity('comment.comment_node_book.default');
     $this->assertComponent('comment.comment_node_book.default', 'comment_body', 'text_default', 'hidden', 0);
 
-    $this->assertEntity('comment.comment_node_forum.default');
-    $this->assertComponent('comment.comment_node_forum.default', 'comment_body', 'text_default', 'hidden', 0);
+    $this->assertEntity('comment.comment_forum.default');
+    $this->assertComponent('comment.comment_forum.default', 'comment_body', 'text_default', 'hidden', 0);
 
     $this->assertEntity('comment.comment_node_page.default');
     $this->assertComponent('comment.comment_node_page.default', 'comment_body', 'text_default', 'hidden', 0);
diff --git a/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldInstanceTest.php b/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldInstanceTest.php
index ef12ac1..79ea506 100644
--- a/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldInstanceTest.php
+++ b/core/modules/field/tests/src/Kernel/Migrate/d7/MigrateFieldInstanceTest.php
@@ -6,6 +6,7 @@
 use Drupal\field\Entity\FieldConfig;
 use Drupal\field\FieldConfigInterface;
 use Drupal\taxonomy\Entity\Vocabulary;
+use Drupal\Tests\migrate\Kernel\NodeCommentComboTrait;
 use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
 use Drupal\node\Entity\NodeType;
 
@@ -16,10 +17,10 @@
  */
 class MigrateFieldInstanceTest extends MigrateDrupal7TestBase {
 
+  use NodeCommentComboTrait;
+
   /**
-   * The modules to be enabled during the test.
-   *
-   * @var array
+   * {@inheritdoc}
    */
   public static $modules = [
     'comment',
@@ -40,36 +41,17 @@ class MigrateFieldInstanceTest extends MigrateDrupal7TestBase {
   protected function setUp() {
     parent::setUp();
     $this->installConfig(static::$modules);
-    $this->createType('page');
-    $this->createType('article');
-    $this->createType('blog');
-    $this->createType('book');
-    $this->createType('forum');
-    $this->createType('test_content_type');
+    $this->createNodeCommentCombo('page');
+    $this->createNodeCommentCombo('article');
+    $this->createNodeCommentCombo('blog');
+    $this->createNodeCommentCombo('book');
+    $this->createNodeCommentCombo('forum', 'comment_forum');
+    $this->createNodeCommentCombo('test_content_type');
     Vocabulary::create(['vid' => 'test_vocabulary'])->save();
     $this->executeMigrations(['d7_field', 'd7_field_instance']);
   }
 
   /**
-   * Creates a node type with a corresponding comment type.
-   *
-   * @param string $id
-   *   The node type ID.
-   */
-  protected function createType($id) {
-    NodeType::create([
-      'type' => $id,
-      'label' => $this->randomString(),
-    ])->save();
-
-    CommentType::create([
-      'id' => 'comment_node_' . $id,
-      'label' => $this->randomString(),
-      'target_entity_type_id' => 'node',
-    ])->save();
-  }
-
-  /**
    * Asserts various aspects of a field config entity.
    *
    * @param string $id
@@ -127,7 +109,7 @@ public function testFieldInstances() {
     $this->assertEntity('comment.comment_node_book.comment_body', 'Comment', 'text_long', TRUE, FALSE);
     $this->assertEntity('node.book.body', 'Body', 'text_with_summary', FALSE, FALSE);
     $this->assertEntity('node.forum.taxonomy_forums', 'Forums', 'entity_reference', TRUE, FALSE);
-    $this->assertEntity('comment.comment_node_forum.comment_body', 'Comment', 'text_long', TRUE, FALSE);
+    $this->assertEntity('comment.comment_forum.comment_body', 'Comment', 'text_long', TRUE, FALSE);
     $this->assertEntity('node.forum.body', 'Body', 'text_with_summary', FALSE, FALSE);
     $this->assertEntity('comment.comment_node_test_content_type.comment_body', 'Comment', 'text_long', TRUE, FALSE);
     $this->assertEntity('node.test_content_type.field_boolean', 'Boolean', 'boolean', FALSE, FALSE);
diff --git a/core/modules/field/tests/src/Kernel/Migrate/d7/RollbackFieldInstanceTest.php b/core/modules/field/tests/src/Kernel/Migrate/d7/RollbackFieldInstanceTest.php
index e71ac3c..4d93d18 100644
--- a/core/modules/field/tests/src/Kernel/Migrate/d7/RollbackFieldInstanceTest.php
+++ b/core/modules/field/tests/src/Kernel/Migrate/d7/RollbackFieldInstanceTest.php
@@ -35,7 +35,7 @@ public function testFieldInstances() {
       'comment.comment_node_book.comment_body',
       'node.book.body',
       'node.forum.taxonomy_forums',
-      'comment.comment_node_forum.comment_body',
+      'comment.comment_forum.comment_body',
       'node.forum.body',
       'comment.comment_node_test_content_type.comment_body',
       'node.test_content_type.field_boolean',
diff --git a/core/modules/migrate/tests/src/Kernel/NodeCommentComboTrait.php b/core/modules/migrate/tests/src/Kernel/NodeCommentComboTrait.php
new file mode 100644
index 0000000..ca9e6af
--- /dev/null
+++ b/core/modules/migrate/tests/src/Kernel/NodeCommentComboTrait.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\Tests\migrate\Kernel;
+
+use Drupal\comment\Entity\CommentType;
+use Drupal\node\Entity\NodeType;
+
+/**
+ * Provides methods for testing node and comment combinations.
+ */
+trait NodeCommentComboTrait {
+
+  /**
+   * Creates a node type with a corresponding comment type.
+   *
+   * @param string $node_type
+   *   The node type ID.
+   * @param string (optional) $comment_type
+   *   The comment type ID, if not provided defaults to comment_node_{type}.
+   */
+  protected function createNodeCommentCombo($node_type, $comment_type = NULL) {
+    if (!$comment_type) {
+      $comment_type = "comment_node_$node_type";
+    }
+    NodeType::create([
+      'type' => $node_type,
+      'label' => $this->randomString(),
+    ])->save();
+
+    CommentType::create([
+      'id' => $comment_type,
+      'label' => $this->randomString(),
+      'target_entity_type_id' => 'node',
+    ])->save();
+  }
+}
diff --git a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
index 248213a..9ec447d 100644
--- a/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
+++ b/core/modules/migrate_drupal_ui/tests/src/Functional/d7/MigrateUpgrade7Test.php
@@ -45,13 +45,13 @@ protected function getEntityCounts() {
       'block_content' => 1,
       'block_content_type' => 1,
       'comment' => 1,
-      'comment_type' => 8,
+      'comment_type' => 6,
       // Module 'language' comes with 'en', 'und', 'zxx'. Migration adds 'is'.
       'configurable_language' => 4,
       'contact_form' => 3,
       'editor' => 2,
-      'field_config' => 53,
-      'field_storage_config' => 40,
+      'field_config' => 49,
+      'field_storage_config' => 38,
       'file' => 3,
       'filter_format' => 7,
       'image_style' => 6,
@@ -73,9 +73,9 @@ protected function getEntityCounts() {
       'menu_link_content' => 7,
       'view' => 16,
       'date_format' => 11,
-      'entity_form_display' => 18,
+      'entity_form_display' => 16,
       'entity_form_mode' => 1,
-      'entity_view_display' => 29,
+      'entity_view_display' => 27,
       'entity_view_mode' => 14,
       'base_field_override' => 9,
     ];
diff --git a/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php b/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php
index 7d73daf..1109780 100644
--- a/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php
+++ b/core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Database\Database;
 use Drupal\node\Entity\NodeType;
 use Drupal\taxonomy\Entity\Vocabulary;
+use Drupal\Tests\migrate\Kernel\NodeCommentComboTrait;
 use Drupal\Tests\migrate_drupal\Kernel\d7\MigrateDrupal7TestBase;
 use Drupal\user\Entity\User;
 use Drupal\user\RoleInterface;
@@ -18,6 +19,8 @@
  */
 class MigrateUserTest extends MigrateDrupal7TestBase {
 
+  use NodeCommentComboTrait;
+
   /**
    * {@inheritdoc}
    */
@@ -43,12 +46,12 @@ protected function setUp() {
 
     // Prepare to migrate user pictures as well.
     $this->installEntitySchema('file');
-    $this->createType('page');
-    $this->createType('article');
-    $this->createType('blog');
-    $this->createType('book');
-    $this->createType('forum');
-    $this->createType('test_content_type');
+    $this->createNodeCommentCombo('page');
+    $this->createNodeCommentCombo('article');
+    $this->createNodeCommentCombo('blog');
+    $this->createNodeCommentCombo('book');
+    $this->createNodeCommentCombo('forum', 'comment_forum');
+    $this->createNodeCommentCombo('test_content_type');
     Vocabulary::create(['vid' => 'test_vocabulary'])->save();
     $this->executeMigrations([
       'language',
@@ -62,25 +65,6 @@ protected function setUp() {
   }
 
   /**
-   * Creates a node type with a corresponding comment type.
-   *
-   * @param string $id
-   *   The node type ID.
-   */
-  protected function createType($id) {
-    NodeType::create([
-      'type' => $id,
-      'label' => $this->randomString(),
-    ])->save();
-
-    CommentType::create([
-      'id' => 'comment_node_' . $id,
-      'label' => $this->randomString(),
-      'target_entity_type_id' => 'node',
-    ])->save();
-  }
-
-  /**
    * Asserts various aspects of a user account.
    *
    * @param string $id
