diff --git a/core/misc/states.js b/core/misc/states.js
index de6e6b8..e8549b7 100644
--- a/core/misc/states.js
+++ b/core/misc/states.js
@@ -348,7 +348,7 @@ states.Trigger.prototype = {
     var oldValue = valueFn.call(this.element);
 
     // Attach the event callback.
-    this.element.bind(event, $.proxy(function (e) {
+    $(document).on(event, this.element, $.proxy(function (e) {
       var value = valueFn.call(this.element, e);
       // Only trigger the event if the value has actually changed.
       if (oldValue !== value) {
@@ -500,52 +500,50 @@ states.State.prototype = {
  * can override these state change handlers for particular parts of a page.
  */
 
-$(document).bind('state:disabled', function(e) {
-  // Only act when this change was triggered by a dependency and not by the
-  // element monitoring itself.
-  if (e.trigger) {
-    $(e.target)
-      .prop('disabled', e.value)
-        .closest('.form-item, .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.
-    // See https://bugs.webkit.org/show_bug.cgi?id=23789
-  }
-});
-
-$(document).bind('state:required', function(e) {
-  if (e.trigger) {
-    if (e.value) {
-      $(e.target).closest('.form-item, .form-wrapper').find('label').append('<abbr class="form-required" title="' + Drupal.t('This field is required.') + '">*</abbr>');
+$(document).on({
+  'state:disabled': function(e) {
+    // Only act when this change was triggered by a dependency and not by the
+    // element monitoring itself.
+    if (e.trigger) {
+      $(e.target)
+        .attr('disabled', e.value)
+          .closest('.form-item, .form-submit, .form-wrapper').toggleClass('form-disabled', e.value)
+          .find('select, input, textarea').attr('disabled', e.value);
+
+      // Note: WebKit nightlies don't reflect that change correctly.
+      // See https://bugs.webkit.org/show_bug.cgi?id=23789
     }
-    else {
-      $(e.target).closest('.form-item, .form-wrapper').find('label .form-required').remove();
+  },
+  'state:required': function(e) {
+    if (e.trigger) {
+      var $formItems = $(e.target).closest('.form-item, .form-wrapper');
+      if (e.value) {
+        $formItems.find('label').append('<abbr class="form-required" title="' + Drupal.t('This field is required.') + '">*</abbr>');
+      }
+      else {
+        $formItems.find('label .form-required').remove();
+      }
     }
-  }
-});
-
-$(document).bind('state:visible', function(e) {
-  if (e.trigger) {
-    $(e.target).closest('.form-item, .form-submit, .form-wrapper').toggle(e.value);
-  }
-});
-
-$(document).bind('state:checked', function(e) {
-  if (e.trigger) {
-    $(e.target).prop('checked', e.value);
-  }
-});
-
-$(document).bind('state:collapsed', function(e) {
-  if (e.trigger) {
-    if ($(e.target).is('[open]') === e.value) {
-      $(e.target).find('> summary a').click();
+  },
+  'state:visible': function(e) {
+    if (e.trigger) {
+      $(e.target).closest('.form-item, .form-submit, .form-wrapper').toggle(e.value);
+    }
+  },
+  'state:checked': function(e) {
+    if (e.trigger) {
+      $(e.target).attr('checked', e.value);
+    }
+  },
+  'state:collapsed': function(e) {
+    if (e.trigger) {
+      if ($(e.target).is('[open]') === e.value) {
+        $(e.target).find('> summary a').click();
+      }
     }
   }
 });
 
-
 /**
  * These are helper functions implementing addition "operators" and don't
  * implement any logic that is particular to states.
