diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3882c1d6a5f7085b95224122a13c1f68cbf29cd1..538951f70f29414ca13f7b301b665a4ca86d2448 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,6 @@
 # Official language image. Look for the different tagged releases at:
 # https://hub.docker.com/r/library/python/tags/
-image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/python:latest
+image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/python:3.11
 
 # Change pip's cache directory to be inside the project directory since we can
 # only cache local items.
diff --git a/ipranges.py b/ipranges.py
index bcbef0a3b1c7172d393f0c57cd98567f8ec8b13d..3c8e61ed90de5b8b391d16f406d1858233009ee9 100644
--- a/ipranges.py
+++ b/ipranges.py
@@ -4,7 +4,7 @@
 # Copyright (c) 2016, CESNET, z. s. p. o.
 # Use of this source is governed by an ISC license, see LICENSE file.
 
-__version__ = '0.1.12'
+__version__ = '0.1.13'
 __author__ = 'Pavel Kácha <pavel.kacha@cesnet.cz>'
 
 import socket
@@ -26,7 +26,16 @@ class Range(object):
         return self.high() - self.low() + 1
 
     def __eq__(self, other):
-        return (self.low() == other.low() and self.high() == other.high())
+        if (
+            hasattr(self, "single")
+            and hasattr(other, "single")
+            and (
+                issubclass(self.single, other.single)
+                or issubclass(other.single, self.single)
+            )
+        ):
+            return self.low() == other.low() and self.high() == other.high()
+        return False
 
     def __ne__(self, other):
         return not self.__eq__(other)
diff --git a/test_ipranges.py b/test_ipranges.py
index 8ad09556becd8b2a830ed9506c741a26300b0865..ef9b29eaf7c8658af59cf6c89c677f113573a55b 100755
--- a/test_ipranges.py
+++ b/test_ipranges.py
@@ -108,6 +108,14 @@ class TestIPRange(unittest.TestCase):
         self.assertFalse(ip2 != ip3)
         self.assertFalse(ip1 != ip3)
 
+    def test4OtherObject(self):
+        ip1 = IP4Net("192.0.2.65/32")
+        ip2 = IP4Range("192.0.2.65-192.0.2.65")
+        ip3 = IP4("192.0.2.65")
+        self.assertFalse(ip1 == [ip1])
+        self.assertFalse(ip2 == 1)
+        self.assertFalse(ip3 == "192.0.2.65")
+
     def test6SameNetRange(self):
         net1 = IP6Net("2001:db8:220:1::/64")
         net2 = IP6Range("2001:db8:220:1::-2001:db8:220:1:ffff:ffff:ffff:ffff")
@@ -125,6 +133,14 @@ class TestIPRange(unittest.TestCase):
         self.assertFalse(ip2 != ip3)
         self.assertFalse(ip1 != ip3)
 
+    def test6OtherObject(self):
+        ip1 = IP6Net("2001:db8:220:1:248:1893:25c8:1946/128")
+        ip2 = IP6Range("2001:db8:220:1:248:1893:25c8:1946-2001:db8:220:1:248:1893:25c8:1946")
+        ip3 = IP6("2001:db8:220:1:248:1893:25c8:1946")
+        self.assertFalse(ip1 == [ip1])
+        self.assertFalse(ip2 == 1)
+        self.assertFalse(ip3 == "2001:db8:220:1:248:1893:25c8:1946")
+
     def test4Contains(self):
         self.assertTrue(IP4Net("192.0.2.64/28") in IP4Net("192.0.2.64/26"))
         self.assertTrue(IP4Net("192.0.2.64/28") in IP4Range("192.0.2.64-192.0.2.127"))