diff --git a/.coveragerc b/.coveragerc
index c500956af306732322464fa4e5b73ec2062db9f5..9a7a1a528877fb007b177d755864bf3ab1e13097 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -771,6 +771,7 @@ omit =
     homeassistant/components/shelly/light.py
     homeassistant/components/shelly/sensor.py
     homeassistant/components/shelly/switch.py
+    homeassistant/components/shelly/utils.py
     homeassistant/components/sht31/sensor.py
     homeassistant/components/sigfox/sensor.py
     homeassistant/components/simplepush/notify.py
diff --git a/homeassistant/components/shelly/light.py b/homeassistant/components/shelly/light.py
index 85763a51f2ac485327b49db9b7c9f964f6f9d092..7c4af9cf1aef5dbaf706e0ecfb51b5bbf8a19e75 100644
--- a/homeassistant/components/shelly/light.py
+++ b/homeassistant/components/shelly/light.py
@@ -19,12 +19,29 @@ from homeassistant.util.color import (
 from . import ShellyDeviceWrapper
 from .const import DATA_CONFIG_ENTRY, DOMAIN
 from .entity import ShellyBlockEntity
+from .utils import async_remove_entity_by_domain
 
 
 async def async_setup_entry(hass, config_entry, async_add_entities):
     """Set up lights for device."""
     wrapper = hass.data[DOMAIN][DATA_CONFIG_ENTRY][config_entry.entry_id]
-    blocks = [block for block in wrapper.device.blocks if block.type == "light"]
+
+    blocks = []
+    for block in wrapper.device.blocks:
+        if block.type == "light":
+            blocks.append(block)
+        elif (
+            block.type == "relay"
+            and wrapper.device.settings["relays"][int(block.channel)].get(
+                "appliance_type"
+            )
+            == "light"
+        ):
+            blocks.append(block)
+            unique_id = f'{wrapper.device.shelly["mac"]}-{block.type}_{block.channel}'
+            await async_remove_entity_by_domain(
+                hass, "switch", unique_id, config_entry.entry_id
+            )
 
     if not blocks:
         return
diff --git a/homeassistant/components/shelly/switch.py b/homeassistant/components/shelly/switch.py
index 7d14052885893d5948137bba1ec8db43a2e91816..48cb6d728e97b0c9dac94ad7a65b0d0944f550a8 100644
--- a/homeassistant/components/shelly/switch.py
+++ b/homeassistant/components/shelly/switch.py
@@ -7,6 +7,7 @@ from homeassistant.core import callback
 from . import ShellyDeviceWrapper
 from .const import DATA_CONFIG_ENTRY, DOMAIN
 from .entity import ShellyBlockEntity
+from .utils import async_remove_entity_by_domain
 
 
 async def async_setup_entry(hass, config_entry, async_add_entities):
@@ -20,7 +21,20 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
     ):
         return
 
-    relay_blocks = [block for block in wrapper.device.blocks if block.type == "relay"]
+    relay_blocks = []
+    for block in wrapper.device.blocks:
+        if block.type == "relay" and (
+            wrapper.device.settings["relays"][int(block.channel)].get("appliance_type")
+            != "light"
+        ):
+            relay_blocks.append(block)
+            unique_id = f'{wrapper.device.shelly["mac"]}-{block.type}_{block.channel}'
+            await async_remove_entity_by_domain(
+                hass,
+                "light",
+                unique_id,
+                config_entry.entry_id,
+            )
 
     if not relay_blocks:
         return
diff --git a/homeassistant/components/shelly/utils.py b/homeassistant/components/shelly/utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..72ba4dbd3cc86eb2404cd38cf5957444e7e22f39
--- /dev/null
+++ b/homeassistant/components/shelly/utils.py
@@ -0,0 +1,20 @@
+"""Shelly helpers functions."""
+
+import logging
+
+from homeassistant.helpers import entity_registry
+
+_LOGGER = logging.getLogger(__name__)
+
+
+async def async_remove_entity_by_domain(hass, domain, unique_id, config_entry_id):
+    """Remove entity by domain."""
+
+    entity_reg = await hass.helpers.entity_registry.async_get_registry()
+    for entry in entity_registry.async_entries_for_config_entry(
+        entity_reg, config_entry_id
+    ):
+        if entry.domain == domain and entry.unique_id == unique_id:
+            entity_reg.async_remove(entry.entity_id)
+            _LOGGER.debug("Removed %s domain for %s", domain, entry.original_name)
+            break