An OptionSet may not be a Picklist, but a Picklist is always an OptionSet.
This is something I had to consider last week to fix an issue within the Dynamics Custom Emails solution and handle State and Status attributes correctly.
The issue was caused by an unexpected cast from StatusAttributeMetadata to PicklistAttributeMetadata.
Both classes inherits from EnumAttributeMetadata, which represents an OptionSetValue.
When you are working with data, like using IOrganizationService to retrieve some records, the attribute type for one of those records could be an OptionSetValue. If you then retrieve the corresponding metadata (e.g. RetrieveAttributeRequest), this OptionSetValue could be multiple attribute types: a Picklist, an EntityName, a State or a Status.
The following entity diagram shows you the same. These classes are part of the Microsoft.Xrm.Sdk.dll assembly.
Please notice the issue has been resolved in the new Github solution as part of the latest release 184.108.40.206