diff --git a/modules/webform_node/config/install/field.storage.node.webform.yml b/modules/webform_node/config/install/field.storage.node.webform.yml
index ee9415de..e736dbbe 100644
--- a/modules/webform_node/config/install/field.storage.node.webform.yml
+++ b/modules/webform_node/config/install/field.storage.node.webform.yml
@@ -4,6 +4,9 @@ dependencies:
   module:
     - node
     - webform
+  enforced:
+    module:
+      - webform_node
 id: node.webform
 field_name: webform
 entity_type: node
diff --git a/modules/webform_node/config/install/node.type.webform.yml b/modules/webform_node/config/install/node.type.webform.yml
index 7a2f1bf0..3d2a18e4 100644
--- a/modules/webform_node/config/install/node.type.webform.yml
+++ b/modules/webform_node/config/install/node.type.webform.yml
@@ -3,7 +3,7 @@ status: true
 dependencies:
   enforced:
     module:
-      - webform
+      - webform_node
 name: Webform
 type: webform
 description: 'A basic page with a webform attached.'
diff --git a/modules/webform_node/src/ProxyClass/WebformNodeUninstallValidator.php b/modules/webform_node/src/ProxyClass/WebformNodeUninstallValidator.php
new file mode 100644
index 00000000..9c15e053
--- /dev/null
+++ b/modules/webform_node/src/ProxyClass/WebformNodeUninstallValidator.php
@@ -0,0 +1,88 @@
+<?php
+// @codingStandardsIgnoreFile
+
+/**
+ * This file was generated via php core/scripts/generate-proxy-class.php 'Drupal\webform_node\WebformNodeUninstallValidator' "core/modules/webform_node/src".
+ */
+
+namespace Drupal\webform_node\ProxyClass {
+
+    /**
+     * Provides a proxy class for \Drupal\webform_node\WebformNodeUninstallValidator.
+     *
+     * @see \Drupal\Component\ProxyBuilder
+     */
+    class WebformNodeUninstallValidator implements \Drupal\Core\Extension\ModuleUninstallValidatorInterface
+    {
+
+        use \Drupal\Core\DependencyInjection\DependencySerializationTrait;
+
+        /**
+         * The id of the original proxied service.
+         *
+         * @var string
+         */
+        protected $drupalProxyOriginalServiceId;
+
+        /**
+         * The real proxied service, after it was lazy loaded.
+         *
+         * @var \Drupal\webform_node\WebformNodeUninstallValidator
+         */
+        protected $service;
+
+        /**
+         * The service container.
+         *
+         * @var \Symfony\Component\DependencyInjection\ContainerInterface
+         */
+        protected $container;
+
+        /**
+         * Constructs a ProxyClass Drupal proxy object.
+         *
+         * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+         *   The container.
+         * @param string $drupal_proxy_original_service_id
+         *   The service ID of the original service.
+         */
+        public function __construct(\Symfony\Component\DependencyInjection\ContainerInterface $container, $drupal_proxy_original_service_id)
+        {
+            $this->container = $container;
+            $this->drupalProxyOriginalServiceId = $drupal_proxy_original_service_id;
+        }
+
+        /**
+         * Lazy loads the real service from the container.
+         *
+         * @return object
+         *   Returns the constructed real service.
+         */
+        protected function lazyLoadItself()
+        {
+            if (!isset($this->service)) {
+                $this->service = $this->container->get($this->drupalProxyOriginalServiceId);
+            }
+
+            return $this->service;
+        }
+
+        /**
+         * {@inheritdoc}
+         */
+        public function validate($module)
+        {
+            return $this->lazyLoadItself()->validate($module);
+        }
+
+        /**
+         * {@inheritdoc}
+         */
+        public function setStringTranslation(\Drupal\Core\StringTranslation\TranslationInterface $translation)
+        {
+            return $this->lazyLoadItself()->setStringTranslation($translation);
+        }
+
+    }
+
+}
diff --git a/modules/webform_node/src/WebformNodeUninstallValidator.php b/modules/webform_node/src/WebformNodeUninstallValidator.php
new file mode 100644
index 00000000..fc338179
--- /dev/null
+++ b/modules/webform_node/src/WebformNodeUninstallValidator.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Drupal\webform_node;
+
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Extension\ModuleUninstallValidatorInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\Core\StringTranslation\TranslationInterface;
+
+/**
+ * Prevents webform_node module from being uninstalled whilst any webform nodes exist.
+ */
+class WebformNodeUninstallValidator implements ModuleUninstallValidatorInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * Constructs a new WebformNodeUninstallValidator.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
+   *   The string translation service.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, TranslationInterface $string_translation) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->stringTranslation = $string_translation;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validate($module) {
+    $reasons = [];
+    if ($module == 'webform_node') {
+      // The webform node type is provided by the Webform node module. Prevent
+      // uninstall if there are any nodes of that type.
+      if ($this->hasWebformNodes()) {
+        $reasons[] = $this->t('To uninstall Webform node, delete all content that has the Webform content type');
+      }
+    }
+    return $reasons;
+  }
+
+  /**
+   * Determines if there is any webform nodes or not.
+   *
+   * @return bool
+   *   TRUE if there are webform nodes, FALSE otherwise.
+   */
+  protected function hasWebformNodes() {
+    $nodes = $this->entityTypeManager->getStorage('node')->getQuery()
+      ->condition('type', 'webform')
+      ->accessCheck(FALSE)
+      ->range(0, 1)
+      ->execute();
+    return !empty($nodes);
+  }
+
+}
diff --git a/modules/webform_node/webform_node.install b/modules/webform_node/webform_node.install
index 27bb646d..52501807 100644
--- a/modules/webform_node/webform_node.install
+++ b/modules/webform_node/webform_node.install
@@ -5,8 +5,6 @@
  * Install, update and uninstall functions for the webform node module.
  */
 
-use Drupal\node\Entity\NodeType;
-
 /**
  * Implements hook_requirements().
  */
@@ -16,16 +14,8 @@ function webform_node_requirements($phase) {
   // happen during a D7 to D8 content migration.
   // @see https://www.drupal.org/node/2856599
   if ($phase == 'install') {
-    // We have to put the check in a try catch.. otherwise it raise a
-    // NoCorrespondingEntityClassException if this module is a
-    // dependency in a installation profile.
-    try {
-      $node_type = NodeType::load('webform');
-    }
-    catch (Exception $e) {
-      // Do nothing.
-    }
-    if ($node_type) {
+    $manager = \Drupal::entityTypeManager();
+    if ($manager->hasDefinition('node_type') && ($node_type = $manager->getStorage('node_type')->load('webform'))) {
       $requirements['webform_node'] = [
         'title' => t('Webform Node'),
         'description' => t('%title content type already exists, please delete the %title content type before installing the Webform node module.', ['%title' => $node_type->label()]),
@@ -36,20 +26,3 @@ function webform_node_requirements($phase) {
   }
   return $requirements;
 }
-
-/**
- * Implements hook_uninstall().
- */
-function webform_node_uninstall() {
-  // Delete the webform node type.
-  if ($node_type = NodeType::load('webform')) {
-    $node_type->delete();
-  }
-
-  // Delete field storage if it is no longer being used by any bundles.
-  if ($field_storage = \Drupal::entityTypeManager()->getStorage('field_storage_config')->load('node.webform')) {
-    if (!$field_storage->getBundles()) {
-      $field_storage->delete();
-    }
-  }
-}
diff --git a/modules/webform_node/webform_node.services.yml b/modules/webform_node/webform_node.services.yml
new file mode 100644
index 00000000..8a98b957
--- /dev/null
+++ b/modules/webform_node/webform_node.services.yml
@@ -0,0 +1,7 @@
+services:
+  webform_node.uninstall_validator:
+    class: Drupal\webform_node\WebformNodeUninstallValidator
+    tags:
+      - { name: module_install.uninstall_validator }
+    arguments: ['@entity_type.manager', '@string_translation']
+    lazy: true
