Extracting logic out of the case class and keeping them clean ADT

I don’t see the point of the second option. If the function getNamesAccordingToBusinessLogic applies to exactly one instance of the class, then it seems to me that the function should be a method of the class. The companion object is not for functions that take only the implied “this” as an argument.

If you want to be more functional, you should also consider creating a case class that contains the given name and family name (and perhaps also a middle name or names?). Then have your function return that type rather than a tuple of Strings. (You might want to rename your “Name” class to “FullName” and call he new class “Name”.)