diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 4acebe8f6759b7df010f7f43e52f7540fd9e2f9e..07abad742d2cb0de3dd479d7e3ffd614e13dcf01 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -173,9 +173,6 @@
 
 ; JavaScript components
 @RESPATH@/browser/components/BrowserComponents.manifest
-@RESPATH@/components/EnterprisePolicies.js
-@RESPATH@/components/EnterprisePoliciesContent.js
-@RESPATH@/components/EnterprisePolicies.manifest
 @RESPATH@/components/toolkitsearch.manifest
 @RESPATH@/components/extensions.manifest
 #ifdef MOZ_UPDATER
diff --git a/toolkit/components/enterprisepolicies/EnterprisePolicies.jsm b/toolkit/components/enterprisepolicies/EnterprisePolicies.jsm
new file mode 100644
index 0000000000000000000000000000000000000000..0d615ed560f1003fe312621afb55beb1d98be39b
--- /dev/null
+++ b/toolkit/components/enterprisepolicies/EnterprisePolicies.jsm
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+var EXPORTED_SYMBOLS = ["EnterprisePolicies"];
+
+function EnterprisePolicies() {
+  // eslint-disable-next-line mozilla/use-services
+  const appinfo = Cc["@mozilla.org/xre/app-info;1"].getService(
+    Ci.nsIXULRuntime
+  );
+  if (appinfo.processType == appinfo.PROCESS_TYPE_DEFAULT) {
+    const { EnterprisePoliciesManager } = ChromeUtils.import(
+      "resource://gre/modules/EnterprisePoliciesParent.jsm"
+    );
+    return new EnterprisePoliciesManager();
+  }
+  const { EnterprisePoliciesManagerContent } = ChromeUtils.import(
+    "resource://gre/modules/EnterprisePoliciesContent.jsm"
+  );
+  return new EnterprisePoliciesManagerContent();
+}
diff --git a/toolkit/components/enterprisepolicies/EnterprisePolicies.manifest b/toolkit/components/enterprisepolicies/EnterprisePolicies.manifest
deleted file mode 100644
index b3a542b7fd6e29c6533374d18e4ef00636ee23cc..0000000000000000000000000000000000000000
--- a/toolkit/components/enterprisepolicies/EnterprisePolicies.manifest
+++ /dev/null
@@ -1,5 +0,0 @@
-component {ea4e1414-779b-458b-9d1f-d18e8efbc145} EnterprisePolicies.js process=main
-contract @mozilla.org/enterprisepolicies;1 {ea4e1414-779b-458b-9d1f-d18e8efbc145} process=main
-
-component {dc6358f8-d167-4566-bf5b-4350b5e6a7a2} EnterprisePoliciesContent.js process=content
-contract @mozilla.org/enterprisepolicies;1 {dc6358f8-d167-4566-bf5b-4350b5e6a7a2} process=content
diff --git a/toolkit/components/enterprisepolicies/EnterprisePoliciesContent.js b/toolkit/components/enterprisepolicies/EnterprisePoliciesContent.jsm
similarity index 55%
rename from toolkit/components/enterprisepolicies/EnterprisePoliciesContent.js
rename to toolkit/components/enterprisepolicies/EnterprisePoliciesContent.jsm
index c2efb692cc29512ad7791f0f9c8ef28c537293ac..367e7a5f85c4878dc18730eb4660b53101d8bdec 100644
--- a/toolkit/components/enterprisepolicies/EnterprisePoliciesContent.js
+++ b/toolkit/components/enterprisepolicies/EnterprisePoliciesContent.jsm
@@ -2,35 +2,26 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-const { XPCOMUtils } = ChromeUtils.import(
-  "resource://gre/modules/XPCOMUtils.jsm"
-);
-const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-function EnterprisePoliciesManagerContent() {}
+var EXPORTED_SYMBOLS = ["EnterprisePoliciesManagerContent"];
 
-EnterprisePoliciesManagerContent.prototype = {
-  classID: Components.ID("{dc6358f8-d167-4566-bf5b-4350b5e6a7a2}"),
-  QueryInterface: ChromeUtils.generateQI([Ci.nsIEnterprisePolicies]),
-  _xpcom_factory: XPCOMUtils.generateSingletonFactory(
-    EnterprisePoliciesManagerContent
-  ),
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 
+class EnterprisePoliciesManagerContent {
   get status() {
     return (
       Services.cpmm.sharedData.get("EnterprisePolicies:Status") ||
       Ci.nsIEnterprisePolicies.INACTIVE
     );
-  },
+  }
 
   isAllowed(feature) {
     let disallowedFeatures = Services.cpmm.sharedData.get(
       "EnterprisePolicies:DisallowedFeatures"
     );
     return !(disallowedFeatures && disallowedFeatures.has(feature));
-  },
-};
+  }
+}
 
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([
-  EnterprisePoliciesManagerContent,
-]);
+EnterprisePoliciesManagerContent.prototype.QueryInterface = ChromeUtils.generateQI(
+  [Ci.nsIEnterprisePolicies]
+);
diff --git a/toolkit/components/enterprisepolicies/EnterprisePolicies.js b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
similarity index 98%
rename from toolkit/components/enterprisepolicies/EnterprisePolicies.js
rename to toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
index aa8a2e54024ec0cc2beb01cc5950415d3a5afeb3..beb5b8e2f6f2b899a27b6979bebf6c82996456e5 100644
--- a/toolkit/components/enterprisepolicies/EnterprisePolicies.js
+++ b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
@@ -2,6 +2,8 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+var EXPORTED_SYMBOLS = ["EnterprisePoliciesManager"];
+
 const { XPCOMUtils } = ChromeUtils.import(
   "resource://gre/modules/XPCOMUtils.jsm"
 );
@@ -80,15 +82,11 @@ function EnterprisePoliciesManager() {
 }
 
 EnterprisePoliciesManager.prototype = {
-  classID: Components.ID("{ea4e1414-779b-458b-9d1f-d18e8efbc145}"),
   QueryInterface: ChromeUtils.generateQI([
     Ci.nsIObserver,
     Ci.nsISupportsWeakReference,
     Ci.nsIEnterprisePolicies,
   ]),
-  _xpcom_factory: XPCOMUtils.generateSingletonFactory(
-    EnterprisePoliciesManager
-  ),
 
   _initialize() {
     let provider = this._chooseProvider();
@@ -631,6 +629,3 @@ class macOSPoliciesProvider {
     return this._failed;
   }
 }
-
-var components = [EnterprisePoliciesManager];
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
diff --git a/toolkit/components/enterprisepolicies/components.conf b/toolkit/components/enterprisepolicies/components.conf
new file mode 100644
index 0000000000000000000000000000000000000000..284bfc5ae5356c03eb2b4367442791591760d626
--- /dev/null
+++ b/toolkit/components/enterprisepolicies/components.conf
@@ -0,0 +1,14 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+Classes = [
+    {
+        'cid': '{49e8d8ef-a713-492a-a3d2-5c9dad4ce2e5}',
+        'contract_ids': ['@mozilla.org/enterprisepolicies;1'],
+        'jsm': 'resource://gre/modules/EnterprisePolicies.jsm',
+        'constructor': 'EnterprisePolicies',
+    },
+]
diff --git a/toolkit/components/enterprisepolicies/moz.build b/toolkit/components/enterprisepolicies/moz.build
index 8f7d7d8cfed7d1c1499270df0fe75fc96abd0dd6..284089594b2f9f9631765bd7b5517a4ae42e7289 100644
--- a/toolkit/components/enterprisepolicies/moz.build
+++ b/toolkit/components/enterprisepolicies/moz.build
@@ -18,10 +18,14 @@ TEST_DIRS += [
 ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] != "android":
-    EXTRA_COMPONENTS += [
-        'EnterprisePolicies.js',
-        'EnterprisePolicies.manifest',
-        'EnterprisePoliciesContent.js',
+    EXTRA_JS_MODULES += [
+        'EnterprisePolicies.jsm',
+        'EnterprisePoliciesContent.jsm',
+        'EnterprisePoliciesParent.jsm',
+    ]
+
+    XPCOM_MANIFESTS += [
+        'components.conf',
     ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':