I am an object-oriented developer professionally, but I have researched functional programming and (believe that) I understand the key principles which to varying degrees are applied in FP languages.
I've seen how languages which are not FP only have been bringing some of the FP ideas into their languages. I'm interested in seeing how many of the ideas of FP can be brought into an OO language concept I've been working on.
One interesting concept is how Clojure approaches collections. It uses persistent data structures to make collection immutability cheap. I wonder if a similar approach could be taken in an object oriented language, to allow local mutation of an object instance, but not have these mutations affect other instances.
I have watched many of Rich Hickey's talks about the ideas behind Clojure, and in his talk "Are We There Yet?" (Available at: https://www.youtube.com/watch?v=ScEPu1cs4l0), he says:
I’ll leave this an open question for everybody else – is there a way to reconcile this with Object Orientation? Could we separate perception of an object from its identity enough so that we’d still get the benefits of objects but we don’t get a mess later?
This is what I'm interested in exploring.
Are there examples of languages which have tried to implement objects as persistent data structures?
For objects, it would mean they are implemented as a trie which, when aliased, creates a copy of the root nodes, thereby sharing the structure. Then if the instance is mutated the path is copied and the reference points to the new path, leaving the original unaffected.
This is a diagram used in Hickey's "Clojure Concurrency" talk: 
Each instance of the collection (or class in our case) is the yellow node at the top, and the dashed lines show the copied values. The second instance shares the deep structure of the original collection. On the far right we see a modification in the second instance. A node which is 3 layers deep is added, so a copy of the path to its parent (orange and purple) is taken along with each of their direct children (dashed lines). Then the node is added to the copied purple node. The original path (with a red border) is unaffected.
*** UPDATE ***
For clarification, an implementation doesn't have to be a trie (that's just an example used in Clojure), but any tree-like structure with path-copying on mutation (or similar) could be used to implement objects.