diff --git a/src/components/views/room_settings/RoomPublishSetting.tsx b/src/components/views/room_settings/RoomPublishSetting.tsx
index 496678851fa7a32c67275184e683e0c67f8a2506..a940e0591bd4a2ac2b9a96f323d4c1f01383fad4 100644
--- a/src/components/views/room_settings/RoomPublishSetting.tsx
+++ b/src/components/views/room_settings/RoomPublishSetting.tsx
@@ -6,15 +6,16 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com
 Please see LICENSE files in the repository root for full details.
 */
 
-import React, { ChangeEventHandler } from "react";
+import React, { type ChangeEventHandler } from "react";
 import { JoinRule, Visibility } from "matrix-js-sdk/src/matrix";
+import { SettingsToggleInput } from "@vector-im/compound-web";
 
 import { _t } from "../../../languageHandler";
 import { MatrixClientPeg } from "../../../MatrixClientPeg";
 import DirectoryCustomisations from "../../../customisations/Directory";
 import Modal from "../../../Modal";
 import ErrorDialog from "../dialogs/ErrorDialog";
-import { SettingsToggleInput } from "@vector-im/compound-web";
+import { logger } from "matrix-js-sdk/src/logger";
 
 interface IProps {
     roomId: string;
@@ -50,10 +51,13 @@ export default class RoomPublishSetting extends React.PureComponent<IProps, ISta
         const client = MatrixClientPeg.safeGet();
 
         try {
-            await client
-            .setRoomDirectoryVisibility(this.props.roomId, newValue ? Visibility.Public : Visibility.Private) 
+            await client.setRoomDirectoryVisibility(
+                this.props.roomId,
+                newValue ? Visibility.Public : Visibility.Private,
+            );
             this.setState({ isRoomPublished: newValue });
         } catch (ex) {
+            logger.error("Error while setting room directory visibility", ex);
             this.showError();
         } finally {
             this.setState({ busy: false });
@@ -72,16 +76,18 @@ export default class RoomPublishSetting extends React.PureComponent<IProps, ISta
 
         const room = client.getRoom(this.props.roomId);
         const isRoomPublishable = room && room.getJoinRule() !== JoinRule.Invite;
-        const canSetCanonicalAlias = (DirectoryCustomisations.requireCanonicalAliasAccessToPublish?.() === false || this.props.canSetCanonicalAlias);
+        const canSetCanonicalAlias =
+            DirectoryCustomisations.requireCanonicalAliasAccessToPublish?.() === false ||
+            this.props.canSetCanonicalAlias;
 
         let disabledMessage;
         if (!isRoomPublishable) {
             disabledMessage = _t("room_settings|general|publish_warn_invite_only");
         } else if (!canSetCanonicalAlias) {
-            disabledMessage = _t("room_settings|general|publish_warn_cannot_set_canonical");
+            disabledMessage = _t("room_settings|general|publish_warn_no_canonical_permission");
         }
 
-        const enabled =canSetCanonicalAlias && (isRoomPublishable || this.state.isRoomPublished);
+        const enabled = canSetCanonicalAlias && (isRoomPublishable || this.state.isRoomPublished);
 
         return (
             <SettingsToggleInput
diff --git a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx
index e456070cce3cae095bcf4208d32d90ba9b2b7828..0827966ddf67923fc1fde008360390588c54ffba 100644
--- a/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx
+++ b/src/components/views/spaces/SpaceSettingsVisibilityTab.tsx
@@ -6,7 +6,7 @@ SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Com
 Please see LICENSE files in the repository root for full details.
 */
 
-import React, { type JSX, useState } from "react";
+import React, { type ChangeEventHandler, type JSX, useCallback, useState } from "react";
 import {
     type Room,
     EventType,
@@ -15,12 +15,12 @@ import {
     JoinRule,
     type MatrixClient,
 } from "matrix-js-sdk/src/matrix";
+import { SettingsToggleInput } from "@vector-im/compound-web";
 
 import { _t } from "../../../languageHandler";
 import AccessibleButton from "../elements/AccessibleButton";
 import AliasSettings from "../room_settings/AliasSettings";
 import { useStateToggle } from "../../../hooks/useStateToggle";
-import LabelledToggleSwitch from "../elements/LabelledToggleSwitch";
 import { useLocalEcho } from "../../../hooks/useLocalEcho";
 import JoinRuleSettings from "../settings/JoinRuleSettings";
 import { useRoomState } from "../../../hooks/useRoomState";
@@ -50,6 +50,7 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space
     const userId = cli.getUserId()!;
 
     const joinRule = useRoomState(space, (state) => state.getJoinRule());
+
     const [guestAccessEnabled, setGuestAccessEnabled] = useLocalEcho<boolean>(
         () =>
             space.currentState.getStateEvents(EventType.RoomGuestAccess, "")?.getContent()?.guest_access ===
@@ -65,6 +66,10 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space
             ),
         () => setError(_t("room_settings|visibility|error_update_guest_access")),
     );
+    const onGuestAccessEnabledChanged = useCallback<ChangeEventHandler<HTMLInputElement>>(
+        (e) => setGuestAccessEnabled(e.target.checked),
+        [setGuestAccessEnabled],
+    );
     const [historyVisibility, setHistoryVisibility] = useLocalEcho<HistoryVisibility>(
         () =>
             space.currentState.getStateEvents(EventType.RoomHistoryVisibility, "")?.getContent()?.history_visibility ||
@@ -104,17 +109,15 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space
 
                 {showAdvancedSection && (
                     <div className="mx_SettingsTab_toggleWithDescription">
-                        <LabelledToggleSwitch
-                            value={guestAccessEnabled}
-                            onChange={setGuestAccessEnabled}
+                        <SettingsToggleInput
+                            name="guest-access-enabled"
+                            checked={guestAccessEnabled}
+                            onChange={onGuestAccessEnabledChanged}
                             disabled={!canSetGuestAccess}
+                            disabledMessage={_t("room_settings|visibility|guest_access_disabled")}
+                            helpMessage={_t("room_settings|visibility|guest_access_explainer")}
                             label={_t("room_settings|visibility|guest_access_label")}
                         />
-                        <p>
-                            {_t("room_settings|visibility|guest_access_explainer")}
-                            <br />
-                            {_t("room_settings|visibility|guest_access_explainer_public_space")}
-                        </p>
                     </div>
                 )}
             </div>
@@ -157,19 +160,20 @@ const SpaceSettingsVisibilityTab: React.FC<IProps> = ({ matrixClient: cli, space
                     />
                     {advancedSection}
                     <div className="mx_SettingsTab_toggleWithDescription">
-                        <LabelledToggleSwitch
-                            value={historyVisibility === HistoryVisibility.WorldReadable}
-                            onChange={(checked: boolean): void => {
+                        <SettingsToggleInput
+                            name="space-history-visibility"
+                            checked={historyVisibility === HistoryVisibility.WorldReadable}
+                            onChange={(evt): void => {
                                 setHistoryVisibility(
-                                    checked ? HistoryVisibility.WorldReadable : HistoryVisibility.Shared,
+                                    evt.target.checked ? HistoryVisibility.WorldReadable : HistoryVisibility.Shared,
                                 );
                             }}
+                            helpMessage={_t("room_settings|visibility|history_visibility_anyone_space_description")}
                             disabled={!canSetHistoryVisibility}
+                            disabledMessage={_t("room_settings|visibility|history_visibility_anyone_space_disabled")}
                             label={_t("room_settings|visibility|history_visibility_anyone_space")}
                         />
                         <p>
-                            {_t("room_settings|visibility|history_visibility_anyone_space_description")}
-                            <br />
                             <strong>
                                 {_t("room_settings|visibility|history_visibility_anyone_space_recommendation")}
                             </strong>
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json
index 56f22dc6d765eafd31497bb3fad51ec3c78f309d..45a70b886f34b88e4f9bf683efb61eec3f0b7924 100644
--- a/src/i18n/strings/en_EN.json
+++ b/src/i18n/strings/en_EN.json
@@ -2281,6 +2281,8 @@
             "no_aliases_space": "This space has no local addresses",
             "other_section": "Other",
             "publish_toggle": "Publish this room to the public in %(domain)s's room directory?",
+            "publish_warn_invite_only": "You cannot publish a room that is invite-only.",
+            "publish_warn_no_canonical_permission": "You must have permission to set the main address to publish this room.",
             "published_aliases_description": "To publish an address, it needs to be set as a local address first.",
             "published_aliases_explainer_room": "Published addresses can be used by anyone on any server to join your room.",
             "published_aliases_explainer_space": "Published addresses can be used by anyone on any server to join your space.",
@@ -2431,11 +2433,12 @@
             "error_failed_save": "Failed to update the visibility of this space",
             "error_update_guest_access": "Failed to update the guest access of this space",
             "error_update_history_visibility": "Failed to update the history visibility of this space",
-            "guest_access_explainer": "Guests can join a space without having an account.",
-            "guest_access_explainer_public_space": "This may be useful for public spaces.",
+            "guest_access_explainer": "Guests can join a space without having an account. This may be useful for public spaces.",
             "guest_access_label": "Enable guest access",
+            "guest_access_disabled": "You do not have permission to change guest access.",
             "history_visibility_anyone_space": "Preview Space",
             "history_visibility_anyone_space_description": "Allow people to preview your space before they join.",
+            "history_visibility_anyone_space_disabled":"You do not have permission to change history visibilty.",
             "history_visibility_anyone_space_recommendation": "Recommended for public spaces.",
             "title": "Visibility"
         },