diff --git a/synapse/groups/groups_server.py b/synapse/groups/groups_server.py
index c359bfa72b59f96a57edd9b6d6c4765ea3338e51..3599bfe9cfe1381fff0ca93375f17f2ed5eeb4e9 100644
--- a/synapse/groups/groups_server.py
+++ b/synapse/groups/groups_server.py
@@ -794,5 +794,5 @@ def _validate_group_id(group_id):
     if types.contains_invalid_mxid_characters(localpart):
         raise SynapseError(
             400,
-            "Group ID can only contain characters a-z, 0-9, or '_-./'",
+            "Group ID can only contain characters a-z, 0-9, or '=_-./'",
         )
diff --git a/synapse/handlers/register.py b/synapse/handlers/register.py
index c7c091f43ebfdf5f49f1b534e4ecb55d699be324..52aa9964d9c50fd14ad65a07032abb7d4ff99fc7 100644
--- a/synapse/handlers/register.py
+++ b/synapse/handlers/register.py
@@ -49,7 +49,7 @@ class RegistrationHandler(BaseHandler):
         if types.contains_invalid_mxid_characters(localpart):
             raise SynapseError(
                 400,
-                "User ID can only contain characters a-z, 0-9, or '_-./'",
+                "User ID can only contain characters a-z, 0-9, or '=_-./'",
                 Codes.INVALID_USERNAME
             )
 
@@ -255,8 +255,7 @@ class RegistrationHandler(BaseHandler):
         if types.contains_invalid_mxid_characters(localpart):
             raise SynapseError(
                 400,
-                "User ID must only contain characters which do not"
-                " require URL encoding."
+                "User ID can only contain characters a-z, 0-9, or '=_-./'",
             )
         user = UserID(localpart, self.hs.hostname)
         user_id = user.to_string()
diff --git a/synapse/types.py b/synapse/types.py
index efa721273db22ab4d892ad431d90e677438d144f..88eb818de4f797eab636204b1d9849d597539613 100644
--- a/synapse/types.py
+++ b/synapse/types.py
@@ -162,7 +162,7 @@ class GroupID(DomainSpecificString):
     SIGIL = "+"
 
 
-mxid_localpart_allowed_characters = set("_-./" + string.ascii_lowercase + string.digits)
+mxid_localpart_allowed_characters = set("_-./=" + string.ascii_lowercase + string.digits)
 
 
 def contains_invalid_mxid_characters(localpart):