diff --git a/core/lib/Drupal/Core/Render/Element/Button.php b/core/lib/Drupal/Core/Render/Element/Button.php
index c305e22..a646157 100644
--- a/core/lib/Drupal/Core/Render/Element/Button.php
+++ b/core/lib/Drupal/Core/Render/Element/Button.php
@@ -76,7 +76,7 @@ public static function preRenderButton($element) {
     if (!empty($element['#button_type'])) {
       $element['#attributes']['class'][] = 'button--' . $element['#button_type'];
     }
-    // @todo Various JavaScript depends on this button class.
+    $element['#attributes']['class'][] = 'js-form-submit';
     $element['#attributes']['class'][] = 'form-submit';
 
     if (!empty($element['#attributes']['disabled'])) {
diff --git a/core/lib/Drupal/Core/Render/Element/ImageButton.php b/core/lib/Drupal/Core/Render/Element/ImageButton.php
index 5517792..4ee39a6 100644
--- a/core/lib/Drupal/Core/Render/Element/ImageButton.php
+++ b/core/lib/Drupal/Core/Render/Element/ImageButton.php
@@ -85,7 +85,7 @@ public static function preRenderButton($element) {
     if (!empty($element['#button_type'])) {
       $element['#attributes']['class'][] = 'image-button--' . $element['#button_type'];
     }
-    // @todo Various JavaScript depends on this button class.
+    $element['#attributes']['class'][] = 'js-form-submit';
     $element['#attributes']['class'][] = 'form-submit';
 
     if (!empty($element['#attributes']['disabled'])) {
diff --git a/core/misc/states.js b/core/misc/states.js
index c68d1b5..b969da7 100644
--- a/core/misc/states.js
+++ b/core/misc/states.js
@@ -513,7 +513,7 @@
     if (e.trigger) {
       $(e.target)
         .prop('disabled', e.value)
-        .closest('.form-item, .form-submit, .form-wrapper').toggleClass('form-disabled', e.value)
+        .closest('.form-item, .js-form-submit, .form-wrapper').toggleClass('form-disabled', e.value)
         .find('select, input, textarea').prop('disabled', e.value);
 
       // Note: WebKit nightlies don't reflect that change correctly.
@@ -538,7 +538,7 @@
 
   $(document).on('state:visible', function (e) {
     if (e.trigger) {
-      $(e.target).closest('.form-item, .form-submit, .form-wrapper').toggle(e.value);
+      $(e.target).closest('.form-item, .js-form-submit, .form-wrapper').toggle(e.value);
     }
   });
 
diff --git a/core/modules/file/file.js b/core/modules/file/file.js
index ed1ff16..8f0c9db 100644
--- a/core/modules/file/file.js
+++ b/core/modules/file/file.js
@@ -67,13 +67,13 @@
   Drupal.behaviors.fileButtons = {
     attach: function (context) {
       var $context = $(context);
-      $context.find('.form-submit').on('mousedown', Drupal.file.disableFields);
-      $context.find('.form-managed-file .form-submit').on('mousedown', Drupal.file.progressBar);
+      $context.find('.js-form-submit').on('mousedown', Drupal.file.disableFields);
+      $context.find('.form-managed-file .js-form-submit').on('mousedown', Drupal.file.progressBar);
     },
     detach: function (context) {
       var $context = $(context);
-      $context.find('.form-submit').off('mousedown', Drupal.file.disableFields);
-      $context.find('.form-managed-file .form-submit').off('mousedown', Drupal.file.progressBar);
+      $context.find('.js-form-submit').off('mousedown', Drupal.file.disableFields);
+      $context.find('.form-managed-file .js-form-submit').off('mousedown', Drupal.file.progressBar);
     }
   };
 
@@ -128,7 +128,7 @@
      * Trigger the upload_button mouse event to auto-upload as a managed file.
      */
     triggerUploadButton: function (event) {
-      $(event.target).closest('.form-managed-file').find('.form-submit').trigger('mousedown');
+      $(event.target).closest('.form-managed-file').find('.js-form-submit').trigger('mousedown');
     },
     /**
      * Prevent file uploads when using buttons not intended to upload.
