I'm not sure about these as names for the smart constructors. I also have qualms about `processChildRun`, but more on that later. Personally I'm not married to the `mk` prefix we use elsewhere, but I don't think we need to differentiate by using a lowercase version of the type name here either. We do, after all, have that information available in the type signature.

Perhaps, instead of exposing type constructors in this way, we could use a typeclass? If we define the typeclass ourselves, we can avoid exporting the constructor of `ChildRun` altogether...

```haskell
module ... where (Starter(..), ChildStart(), ...)

-- taking account of the rename I've suggested above
data ChildStart = StartClosure !(Closure (Process ())) | .... etc

class Starter a where -- perhaps a bad choice of name, but anyway
  toChildStart :: a -> ChildStart

instance Starter (Closure (Process ())) where
  toChildStart = RunClosure

instance Starter (SendPort (ChildKey, SendPort ProcessId)) where
  toChildStart = StartChan

-- etc
```

This you can use it like so: `defaultChildSpec { childStart = $(mkStaticClosure 'myFunc) }`