diff --git a/jsonpickle/pickler.py b/jsonpickle/pickler.py
index 3d391cb..2103e46 100644
--- a/jsonpickle/pickler.py
+++ b/jsonpickle/pickler.py
@@ -476,8 +476,12 @@ def _flatten_obj_instance(self, obj):
 
         # Support objects with __getstate__(); this ensures that
         # both __setstate__() and __getstate__() are implemented
-        has_getstate = hasattr(obj, '__getstate__')
+        has_own_getstate = (
+            hasattr(type(obj), '__getstate__')
+            and type(obj).__getstate__ is not getattr(object, '__getstate__', None)
+        )
         # not using has_method since __getstate__() is handled separately below
+        # Note: on Python 3.11+, all objects have __getstate__.
 
         if has_class:
             cls = obj.__class__
@@ -549,7 +553,7 @@ def _flatten_obj_instance(self, obj):
                 # check that getstate/setstate is sane
                 if not (
                     state
-                    and hasattr(obj, '__getstate__')
+                    and has_own_getstate
                     and not hasattr(obj, '__setstate__')
                     and not isinstance(obj, dict)
                 ):
@@ -581,7 +585,7 @@ def _flatten_obj_instance(self, obj):
             if has_getinitargs:
                 data[tags.INITARGS] = self._flatten(obj.__getinitargs__())
 
-        if has_getstate:
+        if has_own_getstate:
             try:
                 state = obj.__getstate__()
             except TypeError:
@@ -590,7 +594,8 @@ def _flatten_obj_instance(self, obj):
                 self._pickle_warning(obj)
                 return None
             else:
-                return self._getstate(state, data)
+                if state:
+                    return self._getstate(state, data)
 
         if util.is_module(obj):
             if self.unpicklable:
