diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 3880744..64954bd 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -40,11 +40,15 @@ jobs:
     runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v3
-    - uses: actions/setup-python@v4
-    # Install the testing dependencies from setup.cfg, including pylint
+    - name: Set up Python ${{ matrix.python-version }}
+      uses: actions/setup-python@v4
+      with:
+        python-version: "3.10"
     - name: Upgrade pip
       run: python -m pip install --upgrade pip
-    - name: Upgrade build tools
+    - name: Upgrade build tools and pytest
       run: pip install --upgrade build wheel setuptools
-    - run: pip install .[testing]
-    - run: pylint munch setup.py tests
+    - name: Install dependencies
+      run: pip install ".[testing,yaml]"
+    - name: Lint
+      run: pylint munch setup.py tests
diff --git a/munch/__init__.py b/munch/__init__.py
index 9d5cde1..c331da0 100644
--- a/munch/__init__.py
+++ b/munch/__init__.py
@@ -442,16 +442,21 @@ def munchify(x, factory=Munch):
     seen = dict()
 
     def munchify_cycles(obj):
+        partial, already_seen = pre_munchify_cycles(obj)
+        if already_seen:
+            return partial
+        return post_munchify(partial, obj)
+
+    def pre_munchify_cycles(obj):
         # If we've already begun munchifying obj, just return the already-created munchified obj
         try:
-            return seen[id(obj)]
+            return seen[id(obj)], True
         except KeyError:
             pass
 
         # Otherwise, first partly munchify obj (but without descending into any lists or dicts) and save that
         seen[id(obj)] = partial = pre_munchify(obj)
-        # Then finish munchifying lists and dicts inside obj (reusing munchified obj if cycles are encountered)
-        return post_munchify(partial, obj)
+        return partial, False
 
     def pre_munchify(obj):
         # Here we return a skeleton of munchified obj, which is enough to save for later (in case
@@ -462,7 +467,7 @@ def munchify(x, factory=Munch):
             return type(obj)()
         elif isinstance(obj, tuple):
             type_factory = getattr(obj, "_make", type(obj))
-            return type_factory(munchify_cycles(item) for item in obj)
+            return type_factory(pre_munchify_cycles(item)[0] for item in obj)
         else:
             return obj
 

diff --git a/tests/test_munch.py b/tests/test_munch.py
index 9114e3d..c80b757 100644
--- a/tests/test_munch.py
+++ b/tests/test_munch.py
@@ -557,3 +557,17 @@ def test_get_default_value(munch_obj):
     munch_cls = type(munch_obj)
     kwargs = {} if munch_cls != DefaultFactoryMunch else {"default_factory": munch_obj.default_factory}
     munch_cls.fromDict(data, **kwargs)
+
+
+def test_munchify_tuple_list():
+    data = ([{'A': 'B'}],)
+    actual = munchify(data)
+    expected = ([Munch(A='B')],)
+    assert actual == expected
+
+
+def test_munchify_tuple_list_more_elements():
+    data = (1, 2, [{'A': 'B'}])
+    actual = munchify(data)
+    expected = (1, 2, [Munch({'A': 'B'})])
+    assert actual == expected

munchify broken?
Here is a minimal working example, which is broken.   Is this already fixed?

`munchify((1,2,[{'A': 'B'}])) 
Result: (1, 2, [Munch({'A': 'B'}), Munch({'A': 'B'})])
Expected:  (1, 2, [Munch({'A': 'B'})])`
tests/test_munch.py::test_munchify_tuple_list tests/test_munch.py::test_munchify_tuple_list_more_elements
tests/test_munch.py::test_copy tests/test_munch.py::test_reserved_attributes[__getattribute__] tests/test_munch.py::test_dict_property tests/test_munch.py::test_get_default_value[Munch] tests/test_munch.py::test_reserved_attributes[fromYAML] tests/test_munch.py::test_pickling_unpickling_nested tests/test_munch.py::test_repr tests/test_munch.py::test_reserved_attributes[toJSON] tests/test_munch.py::test_reserved_attributes[__str__] tests/test_munch.py::test_reserved_attributes[copy] tests/test_munch.py::test_reserved_attributes[__format__] tests/test_munch.py::test_repr_default_factory tests/test_munch.py::test_getattr_default_factory tests/test_munch.py::test_reserved_attributes[__getattr__] tests/test_munch.py::test_reserved_attributes[__len__] tests/test_munch.py::test_unmunchify tests/test_munch.py::test_fromDict tests/test_munch.py::test_reserved_attributes[__or__] tests/test_munch.py::test_getitem_dunder_for_subclass tests/test_munch.py::test_pickle_default tests/test_munch.py::test_unmunchify_namedtuple tests/test_munch.py::test_repr_default tests/test_munch.py::test_reserved_attributes[__ror__] tests/test_munch.py::test_reserved_attributes[__iter__] tests/test_munch.py::test_get_default_value[DefaultFactoryMunch] tests/test_munch.py::test_delattr tests/test_munch.py::test_reserved_attributes[__delattr__] tests/test_munch.py::test_get_default_value[DefaultMunch] tests/test_munch.py::test_fromDict_default tests/test_munch.py::test_reserved_attributes[__sizeof__] tests/test_munch.py::test_reserved_attributes[__weakref__] tests/test_munch.py::test_reserved_attributes[__getstate__] tests/test_munch.py::test_reserved_attributes[fromJSON] tests/test_munch.py::test_reserved_attributes[keys] tests/test_munch.py::test_setitem_dunder_for_subclass tests/test_munch.py::test_reserved_attributes[__members__] tests/test_munch.py::test_reserved_attributes[__lt__] tests/test_munch.py::test_reserved_attributes[__setitem__] tests/test_munch.py::test_reserved_attributes[__class__] tests/test_munch.py::test_reserved_attributes[fromDict] tests/test_munch.py::test_reserved_attributes[__contains__] tests/test_munch.py::test_reserved_attributes[values] tests/test_munch.py::test_reserved_attributes[__dir__] tests/test_munch.py::test_copy_default_factory tests/test_munch.py::test_reserved_attributes[toDict] tests/test_munch.py::test_getattr_default tests/test_munch.py::test_reserved_attributes[__dict__] tests/test_munch.py::test_getattr tests/test_munch.py::test_reserved_attributes[pop] tests/test_munch.py::test_toDict tests/test_munch.py::test_reserved_attributes[__setattr__] tests/test_munch.py::test_munchify_cycle tests/test_munch.py::test_reserved_attributes[__doc__] tests/test_munch.py::test_contains tests/test_munch.py::test_reserved_attributes[__init__] tests/test_munch.py::test_reserved_attributes[__getitem__] tests/test_munch.py::test_copy_default tests/test_munch.py::test_reserved_attributes[get] tests/test_munch.py::test_reserved_attributes[__setstate__] tests/test_munch.py::test_base tests/test_munch.py::test_unmunchify_cycle tests/test_munch.py::test_munchify_with_namedtuple tests/test_munch.py::test_setattr_default_factory tests/test_munch.py::test_reserved_attributes[__reduce__] tests/test_munch.py::test_reserved_attributes[__module__] tests/test_munch.py::test_get_default_value[RecursiveMunch] tests/test_munch.py::test_reserved_attributes[__reversed__] tests/test_munch.py::test_setattr tests/test_munch.py::test_reserved_attributes[__gt__] tests/test_munch.py::test_reserved_attributes[fromkeys] tests/test_munch.py::test_reserved_attributes[clear] tests/test_munch.py::test_reserved_attributes[__subclasshook__] tests/test_munch.py::test_reserved_attributes[__eq__] tests/test_munch.py::test_reserved_attributes[__reduce_ex__] tests/test_munch.py::test_reserved_attributes[__new__] tests/test_munch.py::test_dir tests/test_munch.py::test_reserved_attributes[__ne__] tests/test_munch.py::test_reserved_attributes[setdefault] tests/test_munch.py::test_reserved_attributes[__hash__] tests/test_munch.py::test_reserved_attributes[popitem] tests/test_munch.py::test_delattr_default tests/test_munch.py::test_munchify_default_factory tests/test_munch.py::test_reserved_attributes[__le__] tests/test_munch.py::test_reserved_attributes[__class_getitem__] tests/test_munch.py::test_reserved_attributes[update] tests/test_munch.py::test_fromDict_default_factory tests/test_munch.py::test_toJSON_and_fromJSON tests/test_munch.py::test_setattr_default tests/test_munch.py::test_reserved_attributes[toYAML] tests/test_munch.py::test_reserved_attributes[__delitem__] tests/test_munch.py::test_reserved_attributes[__init_subclass__] tests/test_munch.py::test_pickle tests/test_munch.py::test_munchify tests/test_munch.py::test_get_default_value[AutoMunch] tests/test_munch.py::test_reserved_attributes[__ge__] tests/test_munch.py::test_reserved_attributes[__ior__] tests/test_munch.py::test_delattr_default_factory tests/test_munch.py::test_munchify_default tests/test_munch.py::test_reserved_attributes[__repr__] tests/test_munch.py::test_reserved_attributes[items] tests/test_munch.py::test_automunch