.remove from list not working as expected
The problem is that you are changing the list that you are reading. For example, consider the first one read... you delete it, shuffling the second item into the first ‘slot’. However, next time around the loop it is the second item in the list that is picked up - which was originally the third since they have now all shuffled up - so each second item slips through the net. There are various solutions to this - such as processing the list backwards or building a list of items to delete on the first pass and removing them after all items have been processed.

Try :

for obj in reversed(selected_objects):

    if obj.type not in ['MESH','CURVE']:
        selected_objects.remove(obj)


Another option is to use a copy of the list for the loop - rather than the list itself - by using '[:]' to indicate all elements :

for obj in selected_objects[:]:

    if obj.type not in ['MESH','CURVE']:
        selected_objects.remove(obj)


This would allow you to process them in the original sequence but since the loop is acting on a copy of the original list it is not affected by the removal of objects from the list.