There are many 2D animation programs such as Toonboom, Synfig, MOHO and Adobe Flash/Animate. But Blender, with their Grease Pencil feature, is becoming more and more promising as a 2D animation suite.
I am looking into it and learning more and more on its features and its workings. I may make the switch to Blender if all I require for animation production can be supported by the Blender Grease Pencil 2D system.
Here's a Blender Grease Pencil 2D example, created entirely within Blender, which is actually a 3D modelling and animation software. I believe this is made by the amazing folks from the Blender Foundation.
Quite impressive. Here's a tutorial to get started, if you are interested:
So far, from my tests, Grease Pencil is very different from Synfig/Animate/ToonBoom. The only "deal breaker" would be 2D parts can be swapped. Imagine if you are puppeting a 2D character but you want the head to turn, and you have 5 different rotation "sprites" for it. I found a way to accomplish that, with your Grease Pencil elements. You will need to NOT directly animate each grease pencil object on the dopesheet timeline but instead, create a grease pencil object for each "puppet" part. Inside the dope sheet for the grease pencil object part, create your library of different parts. Then, add a Time Offset modifier to the grease pencil object and select the Fixed Frame option. That way, you can animate the frame value property in the Action window of the dope sheet. By doing this, you can also generate Strips to be pushed down into the Non Linear Animation timeline (NLA). A lot of people have complained that Grease Pencil animations cannot be pushed down into the NLA. Well, this is one workaround!! Because you are actually animating the Time Offset modifier value instead of the actual Grease Pencil timeline.
I have yet to create actual productions using Blender, but so far, I'm having good impressions with this free open source software!