XMLValidation layer does not update the the product-type-to-element map upon element modification or removal. Thus the product-type-to-element map can contain elements that have been removed, or modified, leaving it inconsistent with the elements contained in the element map.
As suggested by Brian Foster:
The product-type-to-element map can be changed to map ProductType to ElemementId strings. Then the actual element can be obtained from the element map. The product-type-to-element map would still need to be updated (see below solution) on removal of an element to ensure that it contains no elements previously removed.
An alternative solution:
Update both maps upon modification or removal. This way allows both modified elements and removed elements are handled in the exact same manner. This fix will fail if the element map is modified outside of the removeElement or modifyElement methods.